Node.js+MySQL修改密码功能校验旧密码时服务器无响应卡死问题排查
问题排查与解决方案
核心问题根因
你的service层changePassword方法存在未触发回调的逻辑分支,导致controller层始终等待异步返回,请求持续挂起,最终表现为浏览器加载中、服务假死。
具体缺失的分支场景:当数据库查询到对应用户存在(results.length > 0),但用户提交的当前密码和数据库存储的密码不匹配时,没有调用callback返回结果,整个异步逻辑没有出口。
修复步骤
1. 补全service层缺失的错误回调
修改service文件中的密码判断逻辑,在当前密码校验失败的分支主动调用callback返回错误:
exports.changePassword = (data, callback) => { db.query(`SELECT Password FROM user WHERE u_id=? `, [data.userid], (error, results, feilds) => { if (error) { return callback(error); } if (results.length > 0) { if (data.currentPassword == results[0].Password) { console.log("hello"); db.query( `UPDATE user SET Password=? where u_id=? `, [data.newPassword, data.userid], (error, results, fields) => { if (error) { return callback(error); } if (results.affectedRows > 0) { console.log(results.affectedRows); console.log(results); return callback(null, "updated successfuly"); } else { return callback("Invalid credentials"); } } ); } else { // 新增:当前密码错误时触发回调 return callback("current password incorrect"); } } else { return callback("user not exist"); } }) }
2. 可选优化项
- 不要明文存储密码:建议引入
bcrypt库加密存储用户密码,校验时用bcrypt.compare方法比对,避免明文泄露风险。 - 优化错误提示:把用户不存在、当前密码错误、更新失败的提示做区分,方便前端精准展示错误信息。
- 增加请求超时逻辑:controller层可添加超时兜底处理,避免极端异常场景下请求长时间挂起。
效果验证
修改后测试三个场景确认问题解决:
- 当前密码输入错误:正常返回错误提示,无卡死现象
- 当前密码输入正确:成功更新密码,跳转到
/edit-profile页 - 传入不存在的用户ID:正常返回用户不存在提示
内容的提问来源于stack exchange,提问作者Ankit Ghag
相关产品推荐
相关产品推荐

