Проблема при извлечении данных из mongodb с использованием async / await

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Я использую node.js экспресс-фреймворк для создания REST API и пытаюсь преобразовать мой код из обратных вызовов в методы Async / Await с помощью basic .then() promise с использованием artical . таким образом, при реализации кода ошибка возникает как SyntaxError: await is only valid in async function

Я новичок в javascript и не понимаю, что вызывает эту проблему. У меня ниже структура папок

  MAIN APP
    ├── app.js
    ├── controllers
    │   └── UserController.js
    ├── routes
    │   └── User.js
    └── util
        ├── AuthUtil.js
        ├── Helpers.js
        ├── RestUtil.js
        └── wallet.js
 
  

Моя внутренняя функция контроллера API приведена ниже

 Getone: async (req, res, next) => {
    try {
    MongoClient.connect(config.Database.DFARM.connectString, function(err, client) {
       assert.equal(null, err);
       const db = client.db(config.Database.DFARM.dbName);
      console.log('********db**********',db)
       //Step 1: declare promise

        var myPromise = () => {
           return new Promise((resolve, reject) => {

              db
              .collection('User')
              .find(query)
              .limit(1)
              .toArray(function(err, docs) {
                 err
                    ? reject(err)
                    : resolve(docs[0]);
               });
           });
        };
       //await myPromise
       var result = await myPromise();
       //continue execution
       client.close();
       console.log('********result**********',result)

    //    res.json(result);
    }); //end mongo client
    } catch (e) {
       next(e)
    }
    }
  

Мой маршрутизатор

 router.get('/getone/:id', function (req, res, next) {
    controller.Getone(req, res, next);
});
  

Ответ №1:

Итак, в основном вложенная функция не является асинхронной. итак, вам нужно:

 async function(err, client) {/* your code */}
  

Кстати, почему вы создаете новое обещание внутри асинхронной функции?
вы можете просто выполнить следующее:

 Getone: async (req, res, next) => {
  try {
   const client = await MongoClient.connect(config.Database.DFARM.connectString)
   const db = client.db(config.Database.DFARM.dbName);
   const result = await db
          .collection('User')
          .find(query)
          .limit(1)
          .toArray(function(err, docs) {
             err
                ? reject(err)
                : resolve(docs[0]);
           });
       });
   // do something with result..
   client.close();
   console.log('********result**********',result)
  } catch (error) {
    // handle error
  } 
};
  

Комментарии:

1. Спасибо @Yakir за предложение и помощь

Ответ №2:

Функция «function (err, client)» не является асинхронной, и вы используете await внутри. Итак, вы получаете эту ошибку. Попробуйте «асинхронная функция (ошибка, клиент)»