如何在Commander.js中检查命令参数是否为Null?
解决Commander.js中无法判断参数是否传入的问题
嘿,我明白你遇到的问题了——这其实是因为你没给serve命令显式定义参数,导致Commander.js默认把Command实例本身传给了action的第一个参数,所以不管你传没传参数,target都会是那个Command对象,而不是你期待的用户输入值。
问题根源
你当前的代码里,cli.command('serve')没有声明需要接收参数,所以Commander会把命令实例作为第一个参数注入到action回调里,这就是为什么不传参数时target会输出一堆Command相关的内容。
解决方案:先定义参数,再判断是否传入
要解决这个问题,你需要先给命令声明参数,然后在action里就能正确拿到用户输入的值(或undefined),进而判断是否传入。
1. 定义可选参数(用户可以不传)
如果你希望target是可选的,用方括号[target]声明参数:
cli.command('serve') .alias('s') .description('Create a new project') .arguments('[target]') // 方括号表示可选参数 .action((target, command) => { // 现在第一个参数是用户传入的target,第二个才是Command实例 if (typeof target === 'undefined') { console.log('⚠️ 没有传入target参数'); } else { console.log("TARGET IS: ", target); } });
这时候如果用户没传参数,target会是undefined,你可以通过这个来判断。
2. 定义必填参数(用户必须传)
如果target是必填项,用尖括号<target>声明,这样用户不传参数时Commander会自动报错提示:
cli.command('serve') .alias('s') .description('Create a new project') .arguments('<target>') // 尖括号表示必填参数 .action((target, command) => { console.log("TARGET IS: ", target); // 这里不用判断,因为Commander已经确保用户传入了参数 });
3. 额外:通过Command实例的args属性判断
如果你需要更灵活的判断,也可以借助Command实例的args数组(存储所有用户传入的参数):
.action((target, command) => { if (command.args.length === 0) { console.log('⚠️ 没有传入任何参数'); } else { console.log("TARGET IS: ", command.args[0]); } });
总结
核心就是先给命令显式声明参数,这样Commander才会把用户输入的参数传递给action回调,而不是默认传递命令实例。之后你就可以通过判断参数是否为undefined或者检查command.args的长度,来确定用户有没有传入参数啦。
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

