app.get('/api/db/:tableName', function(req, res){
    res.setHeader('content-type', 'application/json');
    dbPool.getConnection(function(objErr, objConn){
        if(objErr){
            sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable
        }else{
            var tableName = req.params.tableName;
            console.log(tableName);
            var tRows, bRows;
            var today = moment().format('YYYY-MM-DD 00:00:00');
            var current = moment().format('YYYY-MM-DD HH:mm:ss');
            console.log(typeof today);
            console.log(typeof current);
            if(tableName == 'dashboard'){
                objConn.query("SELECT SUM(taranan) as tTara, SUM(bulunan) as tBul, SUM(resmedilen) as tRes FROM "+tableName, function(Err, Rows, Fields){
                    if(Err){
                        sendError(res, 500, 'error', 'query', Err);
                    }else{
                        tRows = Rows;
                        console.log(bRows);
                    }//else
                });
                objConn.query("SELECT SUM(taranan) as bTara, SUM(bulunan) as bBul, SUM(resmedilen) as bRes FROM "+tableName+" WHERE change_on > '"+today+"'", function(Err, Rows, Fields){
                    if(Err){
                        sendError(res, 500, 'error', 'query', Err);
                    }else{
                        bRows = Rows;
                        console.log(bRows);
                    }//else
                });
                console.log(tRows);
                res.send({
                    results : 'success',
                    err : '',
                    err_type : '',
                    Trows : tRows,
                    Brows : bRows
                });
            }else{
                /* EMPTY ZONE */
            }//else
            objConn.release();
        }//else
    });
});


console.logs工作完美。它获取bRows和tRows中的变量,但最后一个console.log(tRows)为空。因为当此行运行时,mysql尚未从db获取数据。我该如何修复此代码?

我知道它有关异步调用。

最佳答案

您说的没错,因为尚未执行回调(未返回结果),所以不会填充变量。您的代码可以快速解决:

if(tableName == 'dashboard'){
    objConn.query("SELECT SUM(taranan) as tTara, SUM(bulunan) as tBul, SUM(resmedilen) as tRes FROM "+tableName, function(Err, Rows, Fields){
        if(Err){
            sendError(res, 500, 'error', 'query', Err);
        }else{
            tRows = Rows;
            console.log(tRows);

            objConn.query("SELECT SUM(taranan) as bTara, SUM(bulunan) as bBul, SUM(resmedilen) as bRes FROM "+tableName+" WHERE change_on > '"+today+"'", function(Err, Rows, Fields){
                if(Err){
                    sendError(res, 500, 'error', 'query', Err);
                }else{
                    bRows = Rows;
                    console.log(bRows);

                    console.log(tRows);
                    res.send({
                        results : 'success',
                        err : '',
                        err_type : '',
                        Trows : tRows,
                        Brows : bRows
                    });

                }//else
            });

        }//else
    });

}else{


这样,在使用tRowsbRows时,它们都已被填充。

说明

我给的代码做什么:


你得到了Ro
您等待tRows的结果,然后得到bRows
您等待bRows的结果,然后使用bRows和tRows发送回信


您的原始代码中发生了什么:


你尝试去骗
你试图得到眉头
您发送答复(无需等待bRows和tRows的结果)


承诺

您可能会注意到嵌套的回调看起来很脏。更好的解决方案是使用诺言。就像bluebird

一些提醒

而不是做很多事情:

if(Err){
  sendError(res, 500, 'error', 'query', Err);
}else{
  tRows = Rows;
  console.log(bRows);
}//else


您可以尝试尽早返回:

if (Err) return sendError(res, 500, 'error', 'query', Err);
tRows = Rows;
console.log(bRows);


祝好运

关于javascript - Node.js MySQL查询行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26380436/

10-11 09:32