Быстрое уточнение:
.collection('name')
возвращает экземпляр Collection
, а не Promise, поэтому нет необходимости await
для него. toArray()
работает вдва режима: либо с обратным вызовом, когда предоставляется функция, либо возвращает Promise, если не предусмотрена функция обратного вызова.
Вы, по сути, ожидаете результат Promise из toArray()
при предоставлении обратного вызовафункция, в результате чего undefined
, потому что обратный вызов имеет приоритет, а обещание не возвращается из-за режима двойной операции toArray ().
Кроме того, toArray(callback)
не принимает функцию async
в качестве обратного вызова.
Вот как должен выглядеть ваш код для извлечения коллекции:
const client = await MongoClient.connect('your mongodb url');
const db = client.db('your database name'); // No await here, because it returns a Db instance.
const collection = db.collection('allinonestores'); // No await here, because it returns a Collection instance.
, а затем код для извлечения результатов:
const db = <get db somehow>;
// You could even ditch the "async" keyword here,
// because you do not do/need any awaits inside the function.
// toArray() without a callback function argument already returns a promise.
async function functionOne(email) {
// Returns a Collection instance, not a Promise, so no need for await.
const collection = db.collection('allinonestore');
// Without a callback, toArray() returns a Promise.
// Because our functionOne is an "async" function, you do not need "await" for the return value.
return collection.find({"email": email}).toArray();
}
и альтернативный код,используя обратный вызов:
const db = <get db somehow>;
// You could even ditch the "async" keyword here,
// because you do not do/need any awaits inside the function.
// You're forced to return a new Promise, in order to wrap the callback
// handling inside it
async function functionOne(email) {
// Returns a Collection instance, not a Promise, so no need for await.
const collection = db.collection('allinonestore');
// We need to create the promise outside the callback here.
return new Promise((resolve, reject) => {
db.find({"email": email}).toArray(function toArrayCallback(err, documents) {
if (!err) {
// No error occurred, so we can solve the promise now.
resolve(documents);
} else {
// Failed to execute the find query OR fetching results as array someway failed.
// Reject the promise.
reject(err);
}
});
});
}