【问题标题】:Node js promises async/awaitNode js 承诺异步/等待
【发布时间】:2023-04-06 02:38:02
【问题描述】:

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

Sql 查询 A 返回 sql 查询 B 中需要的 id。Sql 查询 B 依次返回三个字符串作为 sql 查询 C 中所需的数组。Sql 查询 C 包含一个循环,该循环使用这些字符串中的每一个数组一次。在这个循环中,还有 if/else 条件将返回值分配给特定的变量。

这些是我孤立的查询:

一个

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 的文章,但我正在努力将其应用于我的具体问题。

【问题讨论】:

  • 顺便说一句,它认为 sql 查询 C 不能正常工作,但我想实现我有三个不同的查询(占位符 selectedVar 每次都会更改)并从数据库中分配每个值到不同的变量。

标签: node.js express promise async-await


【解决方案1】:

如果我是你,我会像这样承诺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
  }
});

希望对你有帮助。

【讨论】:

  • 非常感谢!我如何添加查询 D,因为它不依赖于任何其他查询。
  • 您可以使用普通的connection.query 函数调用查询 D。
  • 但是我把它放在哪里呢?我希望完成所有查询,然后将数据写入数组。因此,当我将查询 D 放在 try 和 catch 块的正下方时,null 将存储到我的数组中。
  • 如果你想在最后运行查询,那么在 try 块的末尾调用它!
  • 你能帮我解决这个问题吗? stackoverflow.com/questions/59421010/…
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2018-03-05
相关资源
最近更新 更多