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
相关产品推荐
相关产品推荐

