关于 program.parse方法
老师,为什么.parse方法放在if判断后,这个args打印为undefined。
.PARSE方法放在if判断前边,这个args就可以正常打印出数组??
正在回答 回答被采纳积分+1
同学你好,在.parse执行前脚手架还未解析参数所以获取不到参数,在.parse后可以获取到参数。这是由commander框架决定的代码执行顺序。
而且有一个非常重要的点:commander的代码不是顺序执行的(不是按照书写顺序执行的),这一点可以通过下面的方法得到验证。
建议你用debug调试下面的代码,跟踪代码执行顺序,一目了然。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // test.js const commander = require( 'commander' ); const program = new commander.Command(); // option的第三个参数可以是函数,会对输入的值进行转化 program .command( 'test' ) .option( '-i, --integer <n>' , '整形参数' , parseInt) .option( '-r, --range <a>..<b>' , '区间值' , rangeFn) .action((cmdObj) => { console.log( '执行命令的action' ) console.log(`参数 integer = `, cmdObj.integer); console.log(`参数 range = `, cmdObj.range); }); // 对option:range进行处理,转换为数组 function rangeFn(val) { console.log( '处理option的参数' ) return val.split( '..' ).map(Number); } console.log( '在parse前:' , program.args); program.parse(process.argv); console.log( '在parse后:' , program.args); |
在命令行执行:
1 | node test .js test -i 110电话号码 -r 1..10 |
单步调试的话,会发现代码执行顺序是:
1、program.command -> .option -> .option -> .action 此时只是收集action的参数callback,并没有执行对应callback
2、console.log('在parse前:' ...) 此时脚手架还未对命令行输入的参数进行解析,所以打印结果是空对象
3、program.parse 此时开始解析命令行输入的参数
4、注意:解析参数后流程会跳转到对option的处理逻辑,然后跳转到action的callback逻辑,最后才是.parse下面的代码。
5、如果有设置option的第三个参数是函数,则会对option的值进行处理,比如上面的rangeFn,会将输入的字符串"1..10"转换为数组range=[1,10]
6、执行action的callback逻辑
7、最后才是parse下面的console.log('在parse后')。
最终控制台输出:
1 2 3 4 5 6 | 在parse前: undefined 处理option的参数 执行命令的action 参数 integer = 20 参数 range = [ 1, 10 ] 在parse后: [ 'test' , '-r' , '1..10' , '-i' , '20' ] |
希望我的回答对你有帮助。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧