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

Express+Mongoose查询MongoDB用户异常:未返回指定邮箱用户

按邮箱查询单个用户及密码校验实现方案

核心问题排查

你当前的代码存在两个关键问题:

  1. 查询条件错误:用户Schema中邮箱字段属于contact嵌套对象,直接使用email: req.body.email无法匹配到正确数据,导致查询结果不符合预期。
  2. 缺少密码校验逻辑:仅查询用户未验证密码,无法完成登录的核心验证流程。

解决方案步骤

1. 修正用户查询逻辑

将查询条件改为匹配嵌套的contact.email字段,使用MongoDB的点语法定位嵌套属性:

const findUser = await userSchema.findOne({
  'contact.email': req.body.email // 正确定位嵌套的邮箱字段
});

2. 添加密码校验逻辑

利用bcrypt.compare()方法对比请求体中的明文密码与数据库中存储的哈希密码,验证密码有效性:

// 确保已安装并引入bcrypt
const bcrypt = require('bcrypt');

userRouter.post('/api/loginuser', async (req, res) => {
  try {
    // 按邮箱查询用户
    const findUser = await userSchema.findOne({
      'contact.email': req.body.email
    });

    if (!findUser) {
      return res.status(404).json({ message: '用户不存在' });
    }

    // 校验密码
    const isPasswordValid = await bcrypt.compare(req.body.password, findUser.password);
    if (!isPasswordValid) {
      return res.status(401).json({ message: '密码错误' });
    }

    // 隐藏敏感字段后返回用户信息
    const { password, ...userWithoutPassword } = findUser.toObject();
    res.json({ user: userWithoutPassword, message: '登录成功' });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: '服务器内部错误' });
  }
});

3. 前端代码调整

根据后端返回结果完善登录逻辑的提示与处理:

const loginUser = (e) => {
  e.preventDefault();
  const payload = {
    email: formValues.email,
    password: formValues.password
  };

  axios.post('http://localhost:5001/api/loginuser', payload)
    .then(res => {
      if (res.data.user) {
        sessionStorage.setItem('user', JSON.stringify(res.data.user));
        // navigate('/');
        console.log('登录成功:', res.data.user);
        alert('登录成功');
      } else {
        alert(res.data.message || '登录失败');
      }
    })
    .catch(err => {
      console.error(err);
      alert('登录请求失败,请稍后重试');
    });
};

额外优化建议

  • 添加唯一索引:为contact.email添加唯一索引,避免重复邮箱注册并提升查询效率:
    users.index({ 'contact.email': 1 }, { unique: true });
    
  • 规范状态码:使用标准HTTP状态码返回结果(404=用户不存在、401=密码错误、500=服务器异常),便于前端区分场景处理。
  • 敏感数据过滤:返回用户信息时始终排除密码等敏感字段,避免数据泄露。

内容的提问来源于stack exchange,提问作者DevAcc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:36:26