MongoDB中user._id与字符串全等判断始终进入else分支问题求助
问题原因
Mongoose 从 MongoDB 查询返回的 user._id 本质是 ObjectId 类型的实例对象,而非普通字符串。你使用的 === 严格相等运算符会同时校验值和数据类型,二者类型不匹配,判断结果必然为 false,所以始终进入 else 分支。你看到的 console.log 输出只是 ObjectId 实例的序列化打印结果,不代表它本身是字符串类型。
解决方案
可以任选以下任意一种可靠方案修正判断逻辑:
- 方案1:调用 ObjectId 实例的
toString()方法转为字符串后再比较
const user = await User.findById(req.params.id); if ("61a242dffecd0e0f7b3e36b8" === user._id.toString()) { res.send("hello"); } else { return res.send({ message: "access denied" }); }
- 方案2:使用 Mongoose 内置的
equals()方法直接做 ObjectId 等值判断,无需手动转换类型
const user = await User.findById(req.params.id); if (user._id.equals("61a242dffecd0e0f7b3e36b8")) { res.send("hello"); } else { return res.send({ message: "access denied" }); }
- 方案3:将目标字符串转为 ObjectId 类型后再做等值判断
import { ObjectId } from 'mongodb'; const user = await User.findById(req.params.id); if (new ObjectId("61a242dffecd0e0f7b3e36b8").equals(user._id)) { res.send("hello"); } else { return res.send({ message: "access denied" }); }
不推荐使用
==宽松相等做判断,隐式类型转换可能引入其他不可预期的问题。
内容的提问来源于stack exchange,提问作者Shahab Athar
相关产品推荐
相关产品推荐

