Mysql rest api asynch join результат от многопользовательского - PullRequest
0 голосов
/ 31 января 2019

Я не могу применить асинхронные операции к моей процедуре 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);
                    }
                })
...