后端登录路由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}) } });
问题原因及修复方案
变量作用域错误
token变量定义在else代码块内部,外部的if(user && isMatch)无法访问该变量,导致返回响应时token未定义,这是报错的核心原因。冗余逻辑
else块与后续的if(user && isMatch)判断重复,当密码匹配时,else执行后后续if条件必然成立,完全可以合并逻辑。状态码不规范
用户不存在、密码错误属于客户端错误,应返回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
相关产品推荐
相关产品推荐

