You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:06:08