Я не могу применить асинхронные операции к моей процедуре Express-API api router.Эта функция извлекает записи из трех таблиц (mysql) и объединяет результат в один объект json.
Example: {["table1": [[row 1]. [Row2]], ["table2": [[row 1]. [Row2]], ["table3": [[row 1]. [Row2]] }
Я прошу помощи и, если возможно, краткого объяснения операции.
Пример базы данных MYSQL можно найти на pastebin: https://pastebin.com/tb4zNTJb
Мое маленькое элегантное решение - задержка чтения результата с помощью функции setTimeOut.
router.get("/gettest/:last_limit",async function(req,res){
let retobj = {};
let query = "";
let error = false;
let errormsg = "";
let errorquery = "";
let names = ['table_t1','table_t2','table_t3'];
for (let index = 0; index < names.length; index++) {
const name = names[index];
query = "SELECT * FROM `" + name + "` ORDER BY `DATE` DESC LIMIT " + req.params.last_limit;
connection.query(query, await function (err, rows) {
var vals = [];
for (id in rows) {
vals.push(rows[id]);
}
if (err) {
res.json({
"Error": true,
"errMsg": err,
"Message": "Error executing MySQL query:" + query
});
} else {
retobj[name] = vals;
}
}); // execute query
};
setTimeout(() => { // after delay time all result is available
let o = {
"Error": false,
"Message": "Success",
"LastDraws": retobj
};
console.log(o);
res.json(o);
}, 1000);
});
Я решил проблему, сравнив массив имен таблиц длины со счетчиком элементов, возвращаемых изтаблицы базы данных.Может быть, это не элегантно, но работает и обеспечивает выполнение всех запросов sql.
function:
function getLastRecord(sql)
{
return new Promise(function(resolve, reject) {
connection.query(sql, (err, rows, fields) => {
if (err) {
return reject(err);
}
resolve(rows);
});
});
}
Часть приложения:
names.forEach((name,index) => {
let sql = "SELECT * FROM `" + name + "` ORDER BY `DATE` DESC LIMIT " + req.params.last_limit;
getLastRecord(sql)
.then((rows)=>{
var vals = [];
for (id in rows) vals.push(Object.values(rows[id]));
//console.log('then',vals);
retobj[games[index]] = vals;
})
.then(()=>{
if (Object.keys(retobj).length>=names.length) {
let o = {
"Error": false,
"Message": "Success",
"LastDraws": retobj
};
//console.log(o);
res.json(o);
}
})