NodeJS中ID比较结果异常:预期true却返回false求原因
解决NodeJS中ID比较返回false的问题
嘿,我太懂这种明明看起来一模一样的ID,比较结果却返回false的抓狂感了!从你贴的日志内容来看,这个问题几乎可以肯定是类型不匹配导致的——其中一个ID是MongoDB的ObjectId对象,另一个是普通字符串,哪怕它们在控制台显示的文本完全一致,本质上是不同类型的值,直接用===自然会返回false。
为什么会这样?
MongoDB默认生成的_id字段是ObjectId类型,它不是字符串,只是在console.log的时候会自动转换成字符串形式显示。举个例子:
const userId = req.user._id; console.log(typeof userId); // 输出 "object",而不是 "string"
当你把这个ObjectId对象和一个字符串ID直接用===比较时,因为类型不同,结果必然是false。
两种快速解决方法
方法1:把ObjectId转成字符串再比较
如果你的数组里存的是字符串ID,只需要把req.user._id转成字符串就行:
// 假设你的数组是这样的 const idArray = ["5a8f1df35f65a820f4dc56ed", "5a91e3de5b8d6d18580c9aff", "5a8db5d449c0572dbc60548c"]; idArray.forEach(element => { // 把ObjectId转成字符串后再比较 const isMatch = element === req.user._id.toString(); console.log(`element: "${element}" req.user._id: "${req.user._id.toString()}" ${isMatch}`); });
方法2:用ObjectId自带的equals()方法
如果数组里的元素也是ObjectId对象,直接用MongoDB提供的equals()方法会更靠谱,它会直接比较两个ObjectId的实际值,而不是对象引用:
// 假设数组里存的是ObjectId实例 const objectIdArray = [ ObjectId("5a8f1df35f65a820f4dc56ed"), ObjectId("5a91e3de5b8d6d18580c9aff"), ObjectId("5a8db5d449c0572dbc60548c") ]; objectIdArray.forEach(element => { const isMatch = req.user._id.equals(element); console.log(`element: "${element}" req.user._id: "${req.user._id}" ${isMatch}`); });
额外排查点
如果转成字符串后还是不相等,那可以检查下有没有隐藏的空格、换行符之类的特殊字符——不过从你的日志来看,这种概率很低,优先处理类型问题就好。
内容的提问来源于stack exchange,提问作者Bartłomiej Flis
相关产品推荐
相关产品推荐

