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

MongoDB Atlas登录查询异常:条件判断始终返回true

问题分析与解决方案

问题根源

  • User.find()的问题:find()方法无论是否匹配到文档,都会返回一个数组(空数组或包含匹配项的数组)。在JavaScript中,空数组属于真值(truthy),所以if (await User.find(...))永远会进入true分支。
  • User.findOne()的问题:你直接把User.findOne()的返回值(Mongoose的Query对象)放到if判断里,Query对象本身是真值,不管后续回调里的user是null还是有效文档,这个判断都会为true。而且回调是异步执行的,你的res.send()会在数据库查询完成前就执行,逻辑顺序完全错误。

正确实现方式(推荐Async/Await)

因为你的函数已经声明为async,直接用await处理User.findOne()的异步结果即可,这是最清晰的写法:

exports.login = async (req, res) => {
  try {
    // 用await等待查询结果,拿到user对象(找到则为文档,没找到则为null)
    const user = await User.findOne({ username: req.body.username });
    
    if (user) {
      // 找到匹配用户的逻辑
      res.send("YES");
    } else {
      // 未找到用户的逻辑
      res.send("NO");
    }
  } catch (err) {
    // 捕获数据库查询可能出现的错误
    console.error(err);
    res.status(500).send("服务器错误");
  }
};

补充说明

  • 必须加上try/catch块处理异步操作可能抛出的错误,避免未捕获的Promise异常导致服务崩溃。
  • 如果需要验证密码,记得要和数据库中存储的哈希密码做比对(不要直接明文比较,注册时要先对密码做哈希处理)。
  • 不要混用回调和async/await,保持代码风格一致,async/await的可读性远高于嵌套回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:45:42