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

Node.js登录接口输入错误凭证后应用崩溃的修复咨询

登录接口错误凭证导致崩溃的问题修复

我的登录接口在输入正确凭证时可以正常运行,但输入错误凭证时应用会崩溃并返回"Internal server error"错误信息。虽然我写了catch代码块,但还是希望输入错误凭证时应用不会崩溃。以下是我的登录接口代码:

router.post(
  "/login",
  [
    body("email", "you enter wrong email").isEmail(),
    body("password", "password cannot be blank").exists(),
  ],
  async (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    const { email, password } = req.body;
    try {
      let user = await User.findOne({ email });
      if (!user) {
        res.status(400).json({ error: "Please try to login with correct credentials" });
      }
      const passwordcompare = await bcrypt.compare(password, user.password);
      if (!passwordcompare) {
        res.status(400).json({ error: "Please Try to login with correct credential" });
      }
      const data = {
        user: {
          id: user.id,
        },
      };
      const authtoken = jwt.sign(data, JWTSECRET);
      res.json({ authtoken });
    } catch (error) {
      console.log(error.message);
      res.status(500).send("Internal  server error");
    }
  },
);

module.exports = router;

问题原因

当输入不存在的邮箱时,User.findOne返回null,此时执行if (!user)会返回400响应,但没有终止函数执行,代码会继续往下运行到user.password,此时user是undefined,访问password属性会抛出TypeError,被catch块捕获后返回500错误。同样,密码不匹配时的响应也没有终止函数,会导致后续生成token的代码继续执行,引发重复响应问题。

修复方案

在每个错误响应的语句后面添加return,终止函数执行,避免后续代码继续运行:

router.post(
  "/login",
  [
    body("email", "请输入正确格式的邮箱").isEmail(),
    body("password", "密码不能为空").exists(),
  ],
  async (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    const { email, password } = req.body;
    try {
      let user = await User.findOne({ email });
      if (!user) {
        // 添加return终止函数,避免后续代码执行
        return res.status(400).json({ error: "请使用正确的凭证登录" });
      }
      const passwordcompare = await bcrypt.compare(password, user.password);
      if (!passwordcompare) {
        // 添加return终止函数
        return res.status(400).json({ error: "请使用正确的凭证登录" });
      }
      const data = {
        user: {
          id: user.id,
        },
      };
      const authtoken = jwt.sign(data, JWTSECRET);
      res.json({ authtoken });
    } catch (error) {
      console.log(error.message);
      res.status(500).send("Internal server error");
    }
  },
);

module.exports = router;

说明

  • 添加return后,当检测到用户不存在或密码不匹配时,会立即返回错误响应并终止函数,不会执行后续代码,彻底避免了user为undefined时访问属性的错误。
  • 同时也防止了在错误情况下继续生成token并返回,避免出现重复响应的问题。

内容的提问来源于stack exchange,提问作者Mirza M Azeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:35:25