【发布时间】:2017-10-30 19:16:50
【问题描述】:
我正试图让节点的commander 模块以我想要的方式解析参数。
我希望将文件列表上传到命名数据库。有一个默认数据库名称,因此用户不应该需要包含数据库参数。
我希望此命令按以下方式工作:
>>> ./upload.js --db ReallyCoolDB /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to database "ReallyCoolDB")
>>> ./upload.js /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to the default database)
>>> ./upload.js --db ReallyCoolDB
(returns an error; no files provided)
如何使用commander 实现这一点?我已经尝试了很多东西,目前我被这个不起作用的代码卡住了:
// upload.js:
#!/usr/bin/env node
var program = require('commander');
program
.version('0.1.0')
.description('Upload files to a database')
.command('<path1> [morePaths...]')
.option('-d, --db [dbName]', 'Optional name of db', null)
.action(function(path1, morePaths) {
// At this point I simply want:
// 1) a String "dbName" var
// 2) an Array "paths" containing all the paths the user provided
var dbName = program.db || getDefaultDBName();
var paths = [ path1 ].concat(morePaths || []);
console.log(dbName, paths);
// ... do the upload ...
})
.parse(process.argv);
当我尝试运行 ./upload.js 时,我没有得到任何输出!
如何使用指挥官来接受单个可选参数和非空字符串列表?
编辑:感谢 Rob Raisch 的回答,我已经解决了我的问题!解决方案是使用usage 而不是action,在program 命令之后(而不是在action 函数内)完成所有工作,使用program.db 和program.args,并手动确保@987654332 @ 非空:
var program = require('commander');
program
.version('0.1.0')
.description('Upload files to a database')
.usage('[options] <path1> [morePaths ...]') // This improves "--help" output
.option('-d, --db [dbName]', 'Optional name of db', null)
.parse(process.argv);
var dbName = program.db || getDefaultDBName();
var paths = program.args;
if (!paths.length) {
console.log('Need to provide at least one path.');
process.exit(1);
}
// Do the upload!
【问题讨论】: