Node.js MongoDb 查找函数忽略等待
Node.js MongoDb find function ignores wait
我需要在异步函数的 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('error');
}
myObject.add(results);
});
return myObject
}
我见过一些示例,其中使用了模式 find(query).toArray()
而不是 find(query, callback)
。但就我而言,这根本不是 运行。我们使用 Node.js mongodb 3.1.6
和 loopback-connector-mongodb
可能这与问题有关。
如果mongo没有提供承诺应答功能,那么你自己承诺这个。 promise-creating wrapper 和它使用的匿名回调都不应该被声明为异步的,但是调用者应该....
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 回调不符合等待条件,因为它没有 return 承诺。您传递给它的匿名回调函数不是异步函数……它会立即执行工作,只要 find 回调它。所以我们围绕 mongo 构建一个承诺,然后使用新的 async/await 语法来实现这个承诺。
我需要在异步函数的 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('error');
}
myObject.add(results);
});
return myObject
}
我见过一些示例,其中使用了模式 find(query).toArray()
而不是 find(query, callback)
。但就我而言,这根本不是 运行。我们使用 Node.js mongodb 3.1.6
和 loopback-connector-mongodb
可能这与问题有关。
如果mongo没有提供承诺应答功能,那么你自己承诺这个。 promise-creating wrapper 和它使用的匿名回调都不应该被声明为异步的,但是调用者应该....
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 回调不符合等待条件,因为它没有 return 承诺。您传递给它的匿名回调函数不是异步函数……它会立即执行工作,只要 find 回调它。所以我们围绕 mongo 构建一个承诺,然后使用新的 async/await 语法来实现这个承诺。