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{
这样,在使用
tRows
和bRows
时,它们都已被填充。说明
我给的代码做什么:
你得到了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/