Node.js调用CheckPassword时callback无错却触发报错问题
问题根因
你踩了Node.js 错误优先回调(error-first callback) 的规范坑:
- Node.js生态所有异步回调默认遵循错误优先约定,第一个参数
err必须传Error类型实例,不能传布尔值、字符串这类原始类型值。 - 你在
CheckPassword里调用callback(true)时,传入的true是原始布尔值,不是Error对象。你代码里的exports.Error方法大概率默认会读取错误对象的message、stack这类标准属性,传入布尔值时这些属性都是undefined,逻辑执行时就会触发未捕获报错。 - 哪怕传原始值没触发即时报错,也会导致错误栈丢失,后续出问题根本找不到报错位置,属于典型不规范写法。
修复方法
- 所有需要走错误回调的场景,必须传Error实例,禁止传原始值:
// 错误写法 callback(true) // 正确写法 callback(new Error("密码校验流程执行异常"))
- 密码不匹配这类属于正常业务判断结果,不属于程序运行错误,不要塞到
err参数里返回,放到第二个结果参数里即可:
// 密码匹配失败走正常业务分支,不要触发错误逻辑 callback(null, false)
调整后的完整参考代码:
exports.CheckPassword("Ender","plaintextpassword",callback) function callback(err, result) { if (err) { // 这里只处理程序运行级别的真异常 exports.Error("Password test " + err.message); return; } // 处理正常业务分支结果 if (!result) { console.log("Password test 密码不匹配"); return; } console.log("Password test 校验通过"); }
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

