Модульная реализация MongoDB с использованием Promises и Async / Await - PullRequest
0 голосов
/ 01 октября 2018

Я хотел бы сделать запрос Ajax на мой сервер MongoDB и использовать данные вместе с другими асинхронными задачами, используя автономную функцию, чтобы я мог максимально модульно кодировать.Я не очень разбираюсь в асинхронном программировании, поэтому могу ошибиться.В моем коде я использовал другую функцию (doubleAfter2Seconds), возвращающую обещание, которая работает отлично.Переменная результата из await getMongoData ("mydb", url) выводится как неопределенная вместо фактических данных.

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://{MyServer}:27017/";

function getMongoData(dboArg, urlArg) {
  var myPromise = () => {
    return new Promise(resolve => {
      MongoClient.connect(urlArg, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db(dboArg);
        dbo.collection(myCollection).find({}).toArray(function(err, result) {
          if (err) throw err;
          console.log(result);
          db.close();
          resolve(result[0]);
        });
      })
    })
  }
}

function doubleAfter2Seconds(x) {
  return new Promise(resolve => {
    console.log("v");
    setTimeout(() => {
      resolve(x * 2);
    }, 1000);
  });
}

async function addAsync(x) {
  // This works
  const a = await doubleAfter2Seconds(10);
  console.log(a);

  // This doesn't work
  result = await getMongoData("mydb", url);
  console.log(result);
  return x;

}

addAsync(10).then((sum) => {
  console.log(sum);
});

1 Ответ

0 голосов
/ 01 октября 2018

Вот исправленная функция getMongoData, основанная на комментариях

function getMongoData(dboArg, urlArg) {
  return new Promise(resolve => {
    MongoClient.connect(urlArg, { useNewUrlParser: true }, function(err, db) {
      if (err) throw err;
      var dbo = db.db(dboArg);
      dbo.collection(myCollection).find({}).toArray(function(err, data) {
        err 
            ? reject(err) 
            : resolve(data[0]);
      });
    })
  })  
}
...