node.js - 使用 yargs 将默认数值添加到可选参数
问题描述
我有一个接受命令行参数的 cli 脚本。
对于 pages 参数,我希望行为是:
> script.js
-> pages 参数未设置。不处理页面
> script.js -p 100
-> pages 参数设置为 100:处理 100 页
> script.js -p
-> pages 参数集没有值:处理无限(无论有多少可用)页面
换句话说:我想给一个可选参数一个默认值。问题是我不知道如何区分用户设置的没有价值的情况和没有设置的情况。
当这样定义时:
var argv = require('yargs')
// omitted code
.alias('p', 'pages')
.describe('p', 'number of pages; infinite by default')
.default('p', -1)
.number('p')
argv.pages
总是-1
我设置-p
与否
当这样定义时:
.alias('p', 'pages')
.describe('p', 'number of pages; infinite by default')
.number('p')
typeof argv.pages
总是undefined
,无论我是否-p
设置
如何在将参数视为可选参数时给出默认值;所以,当它没有设置时没有默认值,只有在没有值的情况下设置为默认值。
(当然有一个解决方法:我可以通过循环 process.argv 来手动解析参数,但我想避免这种情况,因为这违背了使用 yargs 的目的)
解决方案
我不相信 yargs 有这样的方法,我想过使用#coerce()
,但是无论命令行是否有,都会调用该函数-p
,因此它不起作用(除非您检查了 '-p' 和 ' --pages' 在 process.argv 中)。
一种解决方案是删除默认值并在 yargs 完成后对其进行修改。如果您删除默认值并指定-p
,则在 argv 中它只是未定义的。如果您根本不指定-p
,它将根本不是一个属性。
script -p 100 // => { _: [], $: "", pages: 100, p: 100 }
script -p // => { _: [], $: "" pages: undefined, p: undefined }
script // => { _: [], $: "" }
现在我们可以检查页面是否存在于对象中但未定义,然后做任何事情:
var argv = require('yargs')
// omitted code
.alias('p', 'pages')
.describe('p', 'number of pages; infinite by default')
.number('p').argv;
if ('pages' in argv && typeof argv.pages === 'undefined') {
// set to whatever you want
argv.pages = Infinity;
argv.p = Infinity;
}
console.log(argv);
推荐阅读
- html - XSLT:如何将 2 个 xml 文件合并到一张表中
- c# - 如何使用 OnChange 事件制作 HtmlSelect 控件以触发函数背后的 C# 代码
- javascript - 如何以 urdu 格式从数据库中检索 urdu 数据?
- javascript - 设置数组输入php的值
- r - 如何在 r 的 posixlt 中设置日、月和年?
- javascript - 响应式光标动画
- php - OpenCart 3 存储文件夹难题
- linux - 在 Oracle Linux 上从光纤通道 SAN 装载存储
- python - 下载 SQL for Python 时出错
- php - 当标签被格式化并从 url 检索时,SQL 按标签搜索文章