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
相关产品推荐
相关产品推荐

