Node.js пытается использовать async / await для получения данных из mysql select перед использованием переменной - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно перехватить некоторые данные с помощью запроса MySQL и использовать результат для создания и отправки по электронной почте сообщения с его результатами с помощью узла. Я поместил код внутри функции, но вызов запроса по-прежнему остается асинхронным, поскольку результат никогда не возвращается до конца функции, а возвращаемая переменная всегда пуста.

Пробовал другой подход с async / await, но все равно выполнение кажется асинхронным В моем следующем коде просто войти в консольный журнал до шага 3, шаг 4 mde независимо от того, что я пытаюсь сделать в конце вызова функции

async function querydb (utente){
  console.log("sono in querydb");
  var messageHTMLAllegati="";
  var risultatoquery;
  console.log("step 1");
         var connection = mysql.createConnection({
    host     : process.env.IP_address,
    user     : process.env.nome_utente,
    password : process.env.password,
    port     : process.env.port,
    database : process.env.DB,
  });
  console.log("step 2");
  const query = util.promisify(connection.query).bind(connection);

(async () => {
  try {
    console.log("step 3");
    var result = await query('SELECT Link FROM Link_Foto where ID_Utente="' + utente + '"');
    var i = result.length;
    console.log("step 4");
  var j ;
  for (j=0; j < i; j++) {
        messageHTMLAllegati +='<a href="' + result[j].Link + '">Immagine ' + (j+1)+ '</a><BR>';
console.log("print the link found in the DB and added to the text to be printed"+result[j].Link);
        }
  } finally {
    connection.end();
  }
})()
  return messageHTMLAllegati;
}

Я ожидаю, что последняя переменная "messageHTMLAllegati" будет содержать некоторый текст плюс необходимые поля запроса, но она всегда будет пустой. В журнале я вижу, что переменная заполняется, но только после этого функция возвращается, поэтому текст, используемый для составления электронного письма, пуст из раздела БД

1 Ответ

0 голосов
/ 11 июня 2019

метод async / await работает только тогда, когда функции await обещают. такие функции, как 'query' в mysql, используют функцию обратного вызова для получения результата. Поэтому, если вы хотите использовать его с методом async / await, вы должны использовать его в другой функции и получить результат в функции обратного вызова в виде обещания, подобного этому:

function query_promise(q_string){
    return new Promise((resolve, reject)=>{
        query(q_string,(err, result)=>{
        if(err) return reject(err);
        resolve(result);
    });
 });
}

тогда в вашем коде:

var result = await query_promise('SELECT Link FROM Link_Foto where ID_Utente="' + utente + '"');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...