Node.js MongoDb find函数忽略等待
我需要在异步函数的return语句之前触发Node.js MongoDb find函数忽略等待,node.js,promise,mongodb-.net-driver,Node.js,Promise,Mongodb .net Driver,我需要在异步函数的return语句之前触发Node.js mongodb 3.1.6中的find回调函数,但是在回调函数之前调用return语句,即使前面有等待 async function(myId) { const myObject = MyObject() await collection.find({where: {id: myId}}, async (err, results) => { if (err) { logger.error(
Node.js mongodb 3.1.6
中的find
回调函数,但是在回调函数之前调用return语句,即使前面有等待
async function(myId) {
const myObject = MyObject()
await collection.find({where: {id: myId}}, async (err, results) => {
if (err) {
logger.error('error');
}
myObject.add(results);
});
return myObject
}
我看到过一些例子,其中使用了模式
find(query.toArray()
,而不是find(query,callback)
。但在我的情况下,这根本不适用。我们将Node.js mongodb 3.1.6
与环回连接器mongodb
一起使用,这可能与问题有关 如果mongo不提供承诺回复功能,那么您可以自己承诺。创建包装器的承诺和它使用的匿名回调都不应声明为异步,但调用方应
function findById(collection, myId) {
return new Promise((resolve, reject) => {
collection.find({where: {id: myId}}, (err, results) => {
(err)? reject(err): resolve(results);
});
});
}
// now callers can use the async await pattern...
async someFunction() {
try {
let myId = // ...
let collection = // ...
let results = await findById(collection, myId);
// do something with results
} catch (err) {
// error
}
}
关键的想法是,带有回调的collection.find不符合等待的条件,因为它不返回承诺。传递给它的匿名回调函数不是异步函数。。。只要find回叫它,它就会立即开始工作。因此,我们围绕mongo构建了一个承诺,然后使用新的async/await语法来实现该承诺。hmm,的3.1文档甚至没有说它允许回调,并且总是返回游标并返回承诺,这是
wait
关键字使用异步方法正确工作的一个要求。我必须承认这是非常有意义的。我无法理解我使用的find是否有所不同,因为我导入了环回连接器mongodb
(这是一个大项目,我不负责选择库,导入很混乱),但是toArray()
不起作用,我给find的回调在很久以后被调用,我不知道这是否是因为它将其视为选项,而我不知道它是如何使用的。这是可行的,但我仍然不明白为什么我的代码会以这种方式运行。在@kmdreko和其他人的评论之后,我认为我与导入有冲突,这就是原因。关键思想是带有回调的collection.find没有资格等待,因为它没有返回承诺。传递给它的匿名回调函数不是异步函数。。。只要find回叫它,它就会立即开始工作。因此,我的建议是围绕mongo构建一个承诺,然后在该承诺中使用新的async/await语法。你能把这个加到你的答案里吗?我知道我已经标记了它,但这也解释了为什么我的代码不起作用。