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

后端登录路由Postman测试报错,附实现代码求助

登录接口Postman测试报错问题

我用Postman测试自行开发的后端登录路由时出现错误,错误截图如下:
登录报错截图

以下是登录路由的实现代码:

router.post("/login", async (req, res) => {
  try {
    const user =await User.findOne({email:req.body.email})
    if(!user){
      return res 
      .status(200)
      .send({message:"User does not exist",success:false})
    }
    const isMatch=await bcrypt.compare(req.body.password,user.password);
    if(!isMatch){
      return res
      .status(200)
      .send({message:"Password is incorrect ",success:false})
    }
    else {
      const token=jwt.sign({id:user._id},process.env.JWT_SECRET,{
        expiresIn:"1d"
      })
    }
    if(user &&isMatch) {
          res.status(200).send({message:"Login successful",success:true,token,data:token});

    }
  } catch (error) {
    res
    .status(500)
    .send({message:"Error logging in ",success:false,error})

  }
});

问题原因及修复方案

  1. 变量作用域错误
    token变量定义在else代码块内部,外部的if(user && isMatch)无法访问该变量,导致返回响应时token未定义,这是报错的核心原因。

  2. 冗余逻辑
    else块与后续的if(user && isMatch)判断重复,当密码匹配时,else执行后后续if条件必然成立,完全可以合并逻辑。

  3. 状态码不规范
    用户不存在、密码错误属于客户端错误,应返回4xx状态码(如404、401),而非200,不符合HTTP协议规范。

修复后的代码:

router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ email: req.body.email });
    if (!user) {
      return res
        .status(404)
        .send({ message: "用户不存在", success: false });
    }
    const isMatch = await bcrypt.compare(req.body.password, user.password);
    if (!isMatch) {
      return res
        .status(401)
        .send({ message: "密码错误", success: false });
    }
    // 密码匹配直接生成token并返回
    const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, {
      expiresIn: "1d"
    });
    res.status(200).send({
      message: "登录成功",
      success: true,
      token,
      data: token
    });
  } catch (error) {
    res
      .status(500)
      .send({ message: "登录出错", success: false, error: error.message });
  }
});

额外检查项

  • 确认process.env.JWT_SECRET已正确配置,否则JWT签名会失败。
  • Postman请求需使用JSON格式的请求体,且email、password字段名与代码一致。
  • 错误返回时建议只传递error.message,避免泄露服务器敏感信息。

内容的提问来源于stack exchange,提问作者Ahmed Ben Bettaieb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:50:33