Node.js中Commander的parseInt失效问题及无类实现咨询
问题原因分析
这个问题的核心在于全局parseInt的参数签名和Commander解析函数的调用方式不匹配,具体细节如下:
- 全局
parseInt的函数签名是:parseInt(string, radix?),第二个参数是可选的进制数(有效范围是2-36),如果传入超出范围的进制值,会直接返回NaN。 - Commander在调用选项的解析函数时,会自动传递两个参数:
- 第一个是用户输入的字符串值
- 第二个是该选项的历史值(首次调用时就是你指定的默认值,这里是5000)
当你直接把全局parseInt传给Commander的option方法时,实际执行的是:
parseInt("10000", 5000)
进制5000完全超出了有效范围,所以parseInt返回NaN,这就是你看到的结果。
而你在类里写的自定义parseInt函数:
parseInt: (str) => parseInt str
只接收了第一个参数,调用全局parseInt时只传递了字符串,第二个参数默认是undefined——这时候parseInt会自动按10进制解析(对于"10000"这种纯数字字符串),所以能正常得到正确的数值。
不使用类的解决方案
你只需要对全局parseInt做一层包装,确保只把用户输入的字符串传递给它,同时可以明确指定进制(推荐,避免隐式行为),有几种简洁的实现方式:
方案1:用普通函数包装(可读性高)
commander = require 'commander' # 包装parseInt,明确指定10进制,忽略Commander传递的第二个参数 parseIntWrapper = (str) -> parseInt str, 10 commander .option '-n, --connection [n]', 'number of connection', parseIntWrapper, 5000 .option '-m, --message [n]', 'number of messages', parseIntWrapper, 5000 .parse process.argv console.log commander.connection # 输出10000 console.log commander.message # 输出10000
方案2:用箭头函数直接包装(更简洁)
commander = require 'commander' commander .option '-n, --connection [n]', 'number of connection', (str) => parseInt str, 10, 5000 .option '-m, --message [n]', 'number of messages', (str) => parseInt str, 10, 5000 .parse process.argv console.log commander.connection console.log commander.message
方案3:使用Commander内置的数字解析(最推荐)
其实Commander已经内置了数字类型的解析,你不需要自己用parseInt,直接指定类型为Number即可:
commander = require 'commander' commander .option '-n, --connection [n]', 'number of connection', Number, 5000 .option '-m, --message [n]', 'number of messages', Number, 5000 .parse process.argv console.log commander.connection # 输出10000 console.log commander.message # 输出10000
这个方法最简洁,也从根源上避免了自己处理parseInt参数的问题。
内容的提问来源于stack exchange,提问作者Zep
相关产品推荐
相关产品推荐

