Express+MongoDB登录功能异常:进入Catch块返回服务器错误
问题描述
登录功能无法正常工作,触发catch块返回服务器错误。已确认凭证正确,能从req.body获取数据,但console.log(userr)无输出。注册功能正常,数据可存入MongoDB。相关代码如下:
const login = async (req, res) =>{ try { const {email, password} = req.body; console.log(req.body); const userExists = await findOne({email}); console.log(userExists); if (!userExist) { return res.status(400).json({message: "invalid credentials"}); } const userr = await bcrypt.compare(password, userExists.password); if (userr) { res.status(200).json({ msg:"login succesfull", token: await userExists.generateToken(), userId: userExists._id.toString(),}); } else{ res.status(401).json({msg:"invalid email or password"}); } } catch (error) { res.status(500).json({msg:"server error "}); } }
问题分析与解决
- 变量名拼写错误:判断用户是否存在时用了
!userExist,但前面定义的变量是userExists,少了一个s,导致ReferenceError,直接进入catch块。修正为!userExists。 - 未指定MongoDB模型调用
findOne:直接使用findOne({email})会报错,因为该方法属于MongoDB模型(比如User模型),需要改为await User.findOne({email})(需确保已导入对应的User模型)。 - catch块未打印错误信息:当前catch块仅返回服务器错误,无法定位具体问题,建议添加
console.log(error),方便调试时查看错误详情。
修正后的代码示例
// 需确保已导入User模型和bcrypt const User = require('../models/User'); // 路径根据实际项目调整 const bcrypt = require('bcrypt'); const login = async (req, res) =>{ try { const {email, password} = req.body; console.log(req.body); // 指定模型调用findOne const userExists = await User.findOne({email}); console.log(userExists); // 修正变量名拼写 if (!userExists) { return res.status(400).json({message: "invalid credentials"}); } const userr = await bcrypt.compare(password, userExists.password); console.log(userr); // 现在可以正常输出比对结果 if (userr) { res.status(200).json({ msg:"login succesfull", token: await userExists.generateToken(), userId: userExists._id.toString() }); } else{ res.status(401).json({msg:"invalid email or password"}); } } catch (error) { // 打印错误信息便于调试 console.log(error); res.status(500).json({msg:"server error "}); } }
内容的提问来源于stack exchange,提问作者Aashique Ali
相关产品推荐
相关产品推荐

