我是节点js的新手。在我的应用程序中,我正在查询MySql数据库并处理并使用节点js查看处理结果。如果我的查询返回null数据,那么我会执行另一个查询并执行该过程。但是我的res.send(finaldate)代码在功能处理完成之前执行。怎么解决这个问题。 res.send(finaldata)首先在"执行最终数据之前执行#34; ;
var finaldata ={};
//first query
var result = connection.query('myquery', function(err, data_rows){
if(!err){
//second
//doing one more Query for some other records from DB (second query)
connection.query('myquery', function(err, rows, fields){
if(0 < rows.length){
finaldata = //do require stuff for finaldata
}
else{
//third
//do the second query with some condition
connection.query(queryText, function(err, rows, fields) {
finaldata = //do require stuff for finaldata
})
}
res.send(finaldata);
});
}
});
答案 0 :(得分:1)
欢迎来到NodeJS和异步计算世界!
问题是res.send
在第二个connection.query
完成之前执行。要解决此问题,请将res.send放入回调中。
var result = connection.query('myquery', function(err, data_rows) {
if (!err) {
//second
//doing one more Query for some other records from DB (second query)
connection.query('myquery', function(err, rows, fields) {
if (0 < rows.length) {
// do something
res.send( /* send something*/ );
} else {
//third
//do the second query with some condition
connection.query(queryText, function(err, rows, fields) {
// do something
res.send( /*send something*/ ); // 2nd res.send
})
}
});
}
});
答案 1 :(得分:1)
在if和else条件
中使用res.sendvar finaldata = {};
var result = connection.query('myquery', function(err, data_rows) {
if (!err) {
connection.query('myquery', function(err, rows, fields) {
if (0 < rows.length) {
finaldata = //some value
res.send(finaldata);
} else {
connection.query(queryText, function(err, rows, fields) {
finaldata = //some value
res.send(finaldata);
})
}
});
}
});
答案 2 :(得分:0)
你需要简单地将res.send()调用移动到第二个查询的回调中,如下所示:
connection.query('myquery', function(err, rows, fields){
if(0 < rows.length){
finaldata = //do require stuff for finaldata
res.send(finaldata); //<---If data
}
else{
//third
//do the second query with some condition
connection.query(queryText, function(err, rows, fields) {
finaldata = //do require stuff for finaldata
res.send(finaldata); // <--- If no data
})
}
答案 3 :(得分:0)
虽然接受的答案肯定是正确的,但我个人觉得在语法上更容易将查询命令包装到Promise()中,即:
connection.queryPromiser = function(sql, args) {
return new Promise(function(resolve, reject) {
connection.query(
sql,
args,
function(err, results, fields) {
if (err) {
reject(err);
} else {
resolve( {"results": results, "fields": fields} );
}
}
);
});
};
然后你可以这样完成res.send
:
connection.queryPromiser("SELECT id FROM users WHERE username = ?", [ "Sami" ])
.then(function(data) {
if (data.results.length) {
return connection.queryPromiser("SELECT * FROM user_data WHERE user_id = ?", [ data.results[0].id ])
.then(function(data) {
if (data.results.length) {
return data.results[0];
} else {
return "no user_data";
}
});
} else {
return "no user";
}
}).then(res.send)
.catch(console.error);
从技术上讲,任何你能用承诺完成的事情都可以通过回调完成;我发现将事物封装为承诺更容易。