Node.js操作MongoDB:按指定ObjectId和post查询文档始终返回存在
问题分析与修复方案
我来帮你梳理下代码里的几个关键问题,这就是为什么你总是得到"Available"的原因:
1. find()方法的回调参数理解错误
MongoDB的find()方法返回的是游标对象,不是直接的查询结果文档。不管数据库里有没有匹配的数据,这个游标对象都会存在,所以你的if(doc)判断永远为真,自然一直返回"Available"。
如果你只是要检查是否存在匹配的文档,更适合用findOne()方法,它会直接返回匹配的第一个文档,没有匹配的话就返回null。
2. _id查询条件构建错误
你已经创建了uId = { _id: new ObjectId(req.body.uId) },但在find()的查询条件里又写成了{_id: uId, postId:pId}。这相当于你在查询_id等于{_id: ObjectId("xxx")}的文档,而不是_id等于ObjectId("xxx")的文档,这完全不符合你的预期,肯定匹配不到正确的数据。
3. 数据库连接关闭时机不当
你把client.close()放在了else分支里,如果进入if(doc)分支,连接就不会被关闭,长此以往会造成数据库连接泄漏。应该确保无论查询结果如何,都要关闭连接。
修正后的代码示例
我用findOne()重构了你的代码,解决了上述所有问题:
router.post('/check', (req, res) => { const MongoClient = require('mongodb').MongoClient; const ObjectId = require('mongodb').ObjectID; // 把依赖声明移到顶部更规范 MongoClient.connect(dburl, { useNewUrlParser: true }, (err, client) => { if (err) { console.log("Error: " + err); return res.send("Database connection error"); // 错误时也要返回响应 } const uId = new ObjectId(req.body.uId); const pId = req.body.pId; const collect = client.db('Example').collection('Wishlist'); // 使用findOne直接获取匹配文档,无匹配则返回null collect.findOne({ _id: uId, postId: pId }, (err, doc) => { client.close(); // 无论结果如何,先关闭连接 if (err) { console.log("Error: " + err); return res.send("Query error"); } if (doc) { res.send("Available"); } else { res.send("Not available"); } }); }); });
另外,建议你把依赖声明(比如MongoClient和ObjectId的require)移到文件顶部,这样代码结构更清晰,也符合Node.js的编码规范。
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

