async / await не работает для запросов БД mongo - PullRequest
0 голосов
/ 04 января 2019

Рабочий случай:

Асинхронное ожидание работает нормально, когда мы вызываем асинхронную функцию, и эта функция возвращает обещание resol ()

Не рабочий случай:

Асинхронное ожиданиене работает для запросов mongo к БД

пробовал тогда (), async / await

У меня есть 2 файла JS.

В файле one.js я импортирую функцию, которая находится в functionone.js

РАБОЧИЙ СЛУЧАЙ:

Когда one.js выглядит как

var functiononestatus = transactions.functionone(req.session.email).then((came) => {
  console.log(came); // getting `need to be done at first` message
  console.log("exec next")
});

Когда functionone.js выглядит как

module.exports.functionone = functionone;

async function functionone(email) {
  return await new Promise((resolve, reject) => {
    resolve('need to be done at first')
  });
});

НЕ РАБОЧАЯ СЛУЧАЙ (когда нужно выполнить запрос mongo db):

Когда one.js выглядит как

var functiononestatus = transactions.functionone(req.session.email).then((came) => {
  console.log(came); // getting undefined
  console.log("exec next")
});

Когда functionone.js выглядит как

module.exports.functionone = functionone;

async function functionone(email) {

  //mongo starts
  var collection = await connection.get().collection('allinonestores');
  await collection.find({
    "email": email
  }).toArray(async function(err, wallcheck) {
    return await new Promise((resolve, reject) => {
      resolve(wallcheck[0])
    });
  });

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Примечание: Прежде всего мне действительно нужно поблагодарить @mihai Potra за лучший ответ.

Вот и мы

Случай 1:

Если это функциякоторый должен найти документы и вернуть их из MongoDb, как упомянуто mihai, ниже приведен ответ uber cool

const db = <get db somehow>;
async function functionOne(email) {
  const collection = db.collection('allinonestore');
  return collection.find({"email": email}).toArray();
}

case 2:

Если есть вложенные функции, которые должны возвращать значения каждый раз ниже ANSНасколько мне известно, это будет наилучшим

- не нужно использовать асинхронные / ожидающие ключевые слова для каждой функции или нет необходимости затем ()

function one(<parameter>) {
return new Promise(function(resolve, reject) {
const collection = connection.get().collection('<collection_name>');
const docs = collection.find({"Key": Value_fromFunction}).toArray( function (err, result) {
resolve(result[0]);
});

Вот и все, используйте функцию callback в любое время, когда это необходимо.

0 голосов
/ 04 января 2019

Быстрое уточнение:

  1. .collection('name') возвращает экземпляр Collection, а не Promise, поэтому нет необходимости await для него.
  2. 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);
       }
    });
  });
}
...