Node js promises async/await



我在 express 中定义了一个应该包含多个 sql 查询的路由,我不知道如何使用承诺和/或异步/等待来构建它。

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;
} 
});

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;

如何以我描述的方式连接所有这些查询?我已经读过几篇关于承诺和异步/等待的文章,但我正在努力将其应用于我的特定问题。

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

希望对您有所帮助。

最新更新