Node.js基于Mongoose与bcrypt实现登录时密码错误返回异常问题
问题根因
你的模型层login方法业务逻辑设计错误:
- 邮箱存在但密码校验失败、邮箱不存在这两类业务异常场景,你都调用了
reject()抛出异常,直接触发控制器的catch分支,返回了错误码421 - 你原本预期的420错误码仅在
then分支中返回,永远无法被业务异常场景触发 - 同时你没有单独处理数据库查询的系统异常,所有异常场景全部混在了
reject逻辑中
修复方案
调整模型层逻辑,仅将数据库查询这类系统异常放入reject,邮箱不存在、密码错误等业务异常统一通过resolve返回空对象,匹配控制器原有的判断逻辑即可。
修正后的模型代码
const bcrypt = require('bcrypt'); // 确保你已经引入了bcrypt依赖 module.exports.login = (user) => { return new Promise((resolve, reject) => { userModel.findOne({ email: user.email }, (error, row) => { // 仅数据库查询系统异常走reject if (error) { return reject(error); } if (row) { // 密码校验成功返回用户数据 if (bcrypt.compareSync(user.password, row.password)) { return resolve(row); } } // 邮箱不存在/密码错误都返回空对象 resolve({}); }); }); }
修改后业务异常场景都会进入控制器的then分支,触发dbResponse.email != null的否定判断,返回你预期的420错误码;仅系统异常会进入catch返回421,符合预期。
内容的提问来源于stack exchange,提问作者Mohit Pandey
相关产品推荐
相关产品推荐

