Node JS承诺异步/等待

时间:2019-12-11 07:54:21

标签: node.js express promise async-await

我在express中定义了一条路由,该路由应包含多个sql查询,而且我不知道如何使用promises和/或async / await构造它。

Sql查询A返回sql查询B所需的id。sql查询B反过来返回三个字符串作为sql查询C所需的数组。Sql查询C包含一个循环,该循环使用以下每个字符串数组一次。在此循环中,还存在if / else条件,用于将返回值分配给特定变量。

这些是我孤立的查询:

A

connection.query('SELECT ID FROM Config WHERE ConfigID = ?', configid, function (error, result, fields) {
  if (error) throw error;
  else{
      id = result[0].ID;
  } 
});

B

connection.query('SELECT Var1, Var2, Var3 FROM Config2 WHERE ID = ?', id, function (error, result, fields){
   if (error) throw error;
   else {
        var varArray = [];
        varArray.push(result[0].Var1, result[0].Var2, result[0].Var3);
   }        
});

C

for (i = 0; i < varArray.length; i++){
     var selectedVar = varArray[i]; 
     connection.query('SELECT Value FROM Config3 WHERE ConfigID = ? AND VarName = ? ORDER BY Timestmp DESC LIMIT 1', [configid, selectedVar], function (error, result, fields) {
            if (error) throw error;
            else if (i == 0){
                aaa = parseInt(result[0].Value);
            } else if (i == 1){
                bbb = parseInt(result[0].Value);
            } else if (i == 2){
                ccc = parseInt(result[0].Value);
            }
     }); 
}

configid是预定义的,因此不要怀疑它来自何处。 A,B和C必须以顺序执行的方式连接。

然后有另一个查询D,不需要任何先前的值(预定义的configid除外),因此可以在其他值完成之前执行它。

D

connection.query('SELECT Number FROM Config WHERE ConfigID = ?', configid, function (error, result, fields) {
        if (error) throw error;
        else{
            ddd = parseInt(result[0].Number);
        } 
});

完成所有查询并分配了各自的值后,我想将它们写入存储所有数据的新数组中:

data = [];
data[0]= aaa;
data[1]= bbb;
data[2]= ccc;
data[3]= ddd;

如何以我描述的方式连接所有这些查询?我已经阅读了有关promise和async / await的一些文章,但是我正在努力将其应用于我的特定问题。

1 个答案:

答案 0 :(得分:0)

如果我是你,我会像这样承诺connection.query函数。

function runQuery(sql, configid) {
  return new Promise((resolve, reject) => {
    connection.query(sql, configid, function (error, result, fields) {
      if (error) reject(error);
      else {
        resolve(result);
      } 
    });
  });
}

然后,我将使用新的runQuery函数执行SQL查询。例如:

app.get('/', async (req, res, next) => {
  try {
    const result1 = await runQuery('SELECT ID FROM Config WHERE ConfigID = ?', configid);
    const id = result1[0].ID;

    const resutl2 = await runQuery('SELECT Var1, Var2, Var3 FROM Config2 WHERE ID = ?', id);

    // ... and so on
    res.send('Done with it');

  } catch (error) {
    next(error); // Pass the error the express error handler
  }
});

希望有帮助。