关于 program.parse方法

关于 program.parse方法

老师,为什么.parse方法放在if判断后,这个args打印为undefined。

.PARSE方法放在if判断前边,这个args就可以正常打印出数组??

http://img1.sycdn.imooc.com//climg/6034a1ec09b337c708410336.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
Jane锐 2021-08-14 10:37:37

同学你好,在.parse执行前脚手架还未解析参数所以获取不到参数,在.parse后可以获取到参数。这是由commander框架决定的代码执行顺序。

而且有一个非常重要的点:commander的代码不是顺序执行的(不是按照书写顺序执行的),这一点可以通过下面的方法得到验证。


建议你用debug调试下面的代码,跟踪代码执行顺序,一目了然。

代码如下:

// 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);


在命令行执行: 

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后')。


最终控制台输出:

在parse前: undefined
处理option的参数
执行命令的action
参数 integer =  20
参数 range =  [ 1, 10 ]
在parse后: [ 'test', '-r', '1..10', '-i', '20' ]


希望我的回答对你有帮助。


  • Jane锐 #1

    更正一下:


    最终控制台输出:

    在parse前: undefined
    处理option的参数
    执行命令的action
    参数 integer = 110
    参数 range = [ 1, 10 ]
    在parse后: [ 'test', '-r', '1..10', '-i', '110电话号码' ]


    为了验证parseInt的作用,改了输入条件,忘记同步最终控制台输出了。这里更正一下。

    2021-08-14 10:41:13
扬_灵 2021-02-23 17:24:09

同学你好,program.parse(arguments)方法处理参数,该方法的参数是可选的,默认值为process.argv,把处理参数函数放在 if 条件后这时是无法获取到参数信息的。



问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师