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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:06:05