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

Insomnia测试bcrypt登录接口首次成功后服务崩溃问题

故障根因

代码存在3处逻辑漏洞,触发未捕获异常后直接导致Node.js服务进程退出:

  • 分支逻辑无终止控制:查询不到对应用户时,user值为null,此时仅返回了用户不存在的响应,但没有中断后续代码执行,后续读取user.password的操作会直接抛出TypeError: Cannot read properties of null (reading 'password')错误。
  • 重复发送响应:密码比对不匹配的分支同样没有中断执行,返回密码错误的响应后,代码会继续向下执行发送登录成功的响应,同一个请求重复发送响应会触发ERR_HTTP_HEADERS_SENT错误。
  • 异步操作无异常兜底:数据库查询、bcrypt密码比对均为异步操作,全链路没有异常捕获逻辑,未被捕获的Promise rejection会直接触发Node.js进程终止,服务直接崩溃。
修复方案

给所有响应分支加return终止后续逻辑执行,同时用try/catch包裹全链路异步逻辑,捕获所有运行时异常,避免错误直接抛到进程层导致服务退出。
修复后可正常运行的代码如下:

router.post("/auth", async (req, res) => {
  try {
    const { username, password } = req.body;
    // 补充基础参数校验,避免未传参导致的异常
    if (!username || !password) {
      return res.status(400).json({ error: "Please input username and password" });
    }

    const user = await login.findOne({ where: { username } });
    if (!user) {
      return res.json({ error: "User Doesn't Exist" });
    }

    const isPasswordMatch = await bcrypt.compare(password, user.password);
    if (!isPasswordMatch) {
      return res.json({ error: "Wrong Username And Password Combination" });
    }

    return res.json("YOU LOGGED IN!!!");
  } catch (error) {
    // 打印错误日志方便排查,同时返回服务端错误响应,不中断进程
    console.error("Login interface error:", error);
    return res.status(500).json({ error: "Internal Server Error" });
  }
});

module.exports = router;

优化说明:将bcrypt的.then链式调用改成和路由async逻辑匹配的await写法,代码可读性更高,也能统一被外层catch捕获异常。

相关问题截图:
登录接口报错截图

内容的提问来源于stack exchange,提问作者Uzair Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:48:36