Поскольку ваш код getDocument
должен ожидать асинхронную операцию, которая не обеспечивает интерфейс Promise, getDocument
не должна быть функцией async
, поскольку вам нужно создать обещание вручную.(И обратный вызов, который вы даете функции, не сфокусированной на обещаниях, почти никогда не должен быть async
функцией.)
function getDocument(query){
return new Promise((resolve,reject) =>{
MongoClient.connect(url, function(err, db) {
if (err) {
// Reject, don't throw
reject(err);
return;
}
console.log(query);
db.collection("users").find(query).toArray(function(err, result) {
if (err) {
// Reject, don't throw
reject(err);
return;
}
console.log(result);
db.close();
resolve(result);
});
});
});
}
В качестве альтернативы используйте версии с поддержкой обещаний MongoClient.connect
и db.collection("users").find
.MongoDB теперь имеет их в своем JavaScript API (боюсь, у меня нет подробностей).Тогда вы бы использовали async
функцию с await
, чем-то , как это (согласно этому сообщению в блоге ):
// BE SURE TO DOUBLE-CHECK THE DETAILS
async function getDocument(query){
const db = await MongoClient.connect(url);
const await result = db.collection("users").find(query).toArray();
console.log(result);
await db.close(); // No idea whether you need `await` here or not
return result;
}