Express服务端接收错误登录凭证后自动崩溃的问题咨询
问题根因
你的代码所有错误校验分支返回响应后没有终止函数执行,会触发两类错误导致服务崩溃:
- 当邮箱不存在时,
user为null,返回401响应后代码继续向下执行,访问user.password会抛出空指针异常 - 所有返回
res.json()的分支没有加return,会导致同一个请求被多次调用响应接口,Node.js服务不允许对单次请求重复返回响应,触发未捕获异常导致服务退出
修复方案
给所有返回响应的分支增加return语句,终止后续代码执行即可,修复后代码如下:
// 登录接口 router.post('/login', async (req, res) => { try { const user = await User.findOne({ email: req.body.email, }); if (!user) { return res.status(401).json('邮箱不存在'); } const bytes = CryptoJS.AES.decrypt( user.password, process.env.SECRET_KEY ); const originalPassword = bytes.toString(CryptoJS.enc.Utf8); if (originalPassword !== req.body.password) { return res.status(401).json('密码错误'); } const accessToken = jwt.sign( { id: user._id, }, process.env.SECRET_KEY, { expiresIn: '300000' } ); const { password, ...info } = user._doc; return res.status(200).json({ ...info, accessToken }); } catch (err) { // 生产环境建议不要直接返回原始err,避免泄露服务端敏感信息 return res.status(500).json('服务内部错误'); } });
补充建议
生产环境可以引入PM2等进程守护工具,即使服务意外崩溃也会自动重启,避免服务长时间不可用。
内容的提问来源于stack exchange,提问作者user16948010
相关产品推荐
相关产品推荐

