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

