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

Express+MySQL登录输入错误数据导致服务器崩溃问题排查

问题排查与修复方案

我来帮你解决这个服务器崩溃的问题!你的核心问题出在登录逻辑的代码分支未正确终止,导致后续代码访问了未定义的变量,触发未捕获异常让服务器崩溃了。

问题根源分析

看你的logIn函数:

  • 当查询数据库返回空数组(邮箱不存在)时,你返回了user not found!的响应,但没有加return,代码会继续向下执行
  • 此时data[0]是undefined,执行bcrypt.compareSync时尝试访问data[0].user_PassCode,会直接抛出TypeError: Cannot read properties of undefined (reading 'user_PassCode')
  • 这个未被捕获的错误会直接导致Node.js进程崩溃,也就是你看到的"SERVER CONNECTION LOST"提示

另外,数据库查询的错误处理也缺少return,同样可能导致后续代码错误执行。

修复后的代码

export const logIn = (req, res) => {
    const q = "SELECT * FROM Users WHERE user_Email = ? "

    db.query(q, [req.body.user_Email], (err, data) => {
        // 数据库错误处理:加上return终止后续代码
        if (err) return res.status(500).json(err) 
        // 用户不存在:加上return终止后续代码
        if(data.length === 0) return res.status(404).json('user not found!')

        // 此时data[0]一定存在,安全访问密码字段
        const checkPassword = bcrypt.compareSync(
            req.body.user_PassCode,
            data[0].user_PassCode
        )
       
        if(!checkPassword) return res.status(400).json('wrong password or username try again!') 
       
        const token = jwt.sign({ id: data[0].ID }, "secretkey")
        const {user_PassCode, ...others} = data[0]
        
        res.cookie("accessToken", token, {
            httpOnly: true
        }).status(200).json(others)
    })
}

额外建议

为了避免类似问题再次发生,你可以:

  • 所有响应返回语句后都加上return,确保当前分支的代码执行完毕后不会进入其他逻辑
  • 在生产环境中添加全局异常捕获,防止单个未处理错误导致服务器崩溃:
process.on('uncaughtException', (err) => {
  console.error('Uncaught Exception:', err);
  // 可以在这里做一些清理工作,比如关闭数据库连接
  process.exit(1); // 最后还是建议退出进程,避免处于不稳定状态
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:16:37