Получение выходных данных запросов mysql синхронно в node.js

#node.js

#node.js

Вопрос:

У меня есть следующий код:

 app.get('/showtable1', (req, res) => {
  console.log("yo ho");
  mysqlconnection.query('SELECT d_name FROM datacenters', (err, rows, fields) => {
    if (!err) {
      var array = [];
      var tier = ['Class 0','Class 1','Class 2','Class 3'];
      var str = '';
      Object.keys(rows).forEach(function(key) {
        var row = rows[key];
        array.push(row.d_name);
      });
      for( var i = 0 ; i<array.length ; i  ) {
        str  = '<tr><td>' array[i] '</td>';
        console.log('sfsf');
        for (var j=0 ; j< tier.length ; j  ) {
          let query1  = "SELECT * FROM `datacenters` WHERE  d_name = '" array[i] "' AND d_tiers LIKE '%" tier[j] "%'"
          mysqlconnection.query(query1,(err,rows) => {
            if(!err) {
              if(rows.length !=0) {
                console.log(1);
              } else {
                console.log(0);
              }
            }
          });
        }
      }
      res.send(rows);
    } 
    else
      console.log(err);
  })
});
 

Вывод этого кода:

 yo ho
sfsf
sfsf
sfsf
1
1
0
0
1
1
1
0
1
1
1
0
 

Но мне нужен вывод в виде:

 yo ho
sfsf
1
1
0
0
sfsf
1
1
1
0
sfsf
1
1
1
0
 

Первый вывод приходит, потому что код выполняется асинхронно; но мне нужно запустить его синхронно. Как я могу это сделать?

Ответ №1:

Асинхронная задача не имеет порядка. Вы можете использовать Promise и async/await для получения упорядоченного вывода.

Вы можете обещать свои запросы следующим образом:

 function getNames() {
  return new Promise((resolve, reject) => {
    mysqlconnection.query('SELECT d_name FROM datacenters', (err, rows, fields) => {
      if (!err) {
        reject(err);
      } else {
        resolve(rows)
      }
    })
  });
}

function getDatacenters(firstVal, tier) {
  const query1  = "SELECT * FROM `datacenters` WHERE  d_name = '" firstVal "' AND d_tiers LIKE '%" tier "%'";
  return new Promise((resolve, reject) => {
    mysqlconnection.query(query1,(err,rows) => {
      if(!err) {
        reject(err)
      } else {
        resolve(rows)
      }
    });
  })
}
 

Затем в вашем маршруте

 app.get('/showtable1', async (req, res) => {
  console.log("yo ho");
  const namesArray = [];
  const names = await getNames();
  Object.keys(names).forEach(function(key) {
    var row = names[key];
    namesArray.push(row.d_name);
  });

  const namesVal = [];

  for (let i = 0; i < namesArray.length; i  ) {
    for (let j = 0; j < tier.length; j  ) {
      namesVal.push(getDatacenters(entry, tier));
    }
  }

  // ordered array or result
  const result = await Promise.all(namesVal)
  ...
  // rest of the code
})
 

Примечание: я не знаю, какую библиотеку вы используете. Некоторые библиотеки предоставляют Promise поддержку, поэтому вам не нужно писать свои собственные обертки

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

1. вы сделали свою функцию async ?