Node.js中yargs触发addTask执行三次且if/else都运行如何解决
你遇到的addTask重复执行、if/else两个分支都触发的问题,核心原因出在yargs的调用配置上,和tasks.js里的业务逻辑无关,可按以下步骤排查解决:
- 修正yargs解析触发方式
你当前todo.js里的yargs链式调用末尾直接使用.argv触发参数解析,该属性每次被访问都会重新执行一次参数解析与命令匹配,若代码运行过程中该属性被多次访问,就会导致handler重复执行。你看到两个分支都被触发,是因为第一次handler执行时任务不存在,走if分支写入了任务,后续两次重复执行的handler检测到任务已存在就走else分支,属于重复执行后的正常表现。
将末尾的.argv替换为显式的.parse()方法即可避免重复解析,建议同时补充字段类型声明、开启严格匹配模式,修改后的todo.js对应代码如下:
const tasks = require("./tasks"); const yargs = require('yargs'); yargs.command({ command: "Add", builder: { task: { demandOption: true, type: 'string' }, deadline: { demandOption: true, type: 'string' }, }, handler(argv) { tasks.addTask(argv.task, argv.deadline); }, }) .strict() // 开启严格模式,仅匹配明确定义的命令,避免模糊匹配触发异常 .parse();
- 排查重复命令注册
检查项目内是否有其他文件也注册了同名的Add命令且被导入到todo.js中,重复注册的相同命令会被同时触发执行。 - 确认yargs版本稳定性
若上述修改后问题仍存在,可检查当前使用的yargs是否为非正式测试版本,建议更换为稳定版,执行以下命令安装即可:npm install yargs@17.7.2
内容的提问来源于stack exchange,提问作者Dhanush
相关产品推荐
相关产品推荐

