Каков синтаксис использования await и asyn c в асинхронных функциях, использующих nodejs? - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать базовый c API в nodejs для выполнения действий CRUD над базой данных. Я не понимаю, почему результат не определен

exports.getPlaylist = async function (req, res) {
  console.log('Recieved getPlaylist request');
  result = await connection.executeQuery('SELECT * from Users');
  res.status(200).send(result);
  console.log(result); // Logs undefined
};

Это функция, которая вызывается и получает данные из базы данных:

async executeQuery(query) {
    connection.query(query, function (err, result) {
        if (err) {
            console.log('Error executing query: ' + err);
        }

        console.log(result); // logs correct data
        return result;

    });
}

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Вам нужно «обещать» свой обратный звонок. (см. require('utils').promisify) для краткости для применения к функциям, которые следуют за node.js стилем обратного вызова (function(err,result){}).

executeQuery(query) {
    return new Promise((res, rej) => {
        connection.query(query, function (err, result) {
            if (err) {
                console.log('Error executing query: ' + err);
                rej(err)
            } else {
                console.log(result); // logs correct data
                res(result);
            }
        });
    });
}

Теперь внутри функции async вы можете await executeQuery(query)

1 голос
/ 20 января 2020

execute не является базовой функцией обещания, вы не можете использовать await для функции обратного вызова.

изменить функцию execute на promise base

Пример:

 executeQuery(query) {
  return new Promise( (resolve, reject) => {
    connection.query(query, function (err, result) {
      if (err) {
          console.log('Error executing query: ' + err);
          reject('Error executing query: ' + err);
      }

      console.log(result); // logs correct data
      resolve(result);

  });
  });

}

Добавьте try catch в вызывающую функцию

exports.getPlaylist = async function (req, res) {
  console.log('Recieved getPlaylist request');
  try{
    result = await connection.executeQuery('SELECT * from Users');
    res.status(200).send(result);
    console.log(result); // Logs undefined
  } catch(error) {
    console.log(error)
  }

};
...