小白求解~~~~~nodejs+mysql怎么解决嵌套connection.query问题
connection.query(login_user_device+deviceid,
function selectCb(err, results, fields) {
if (err) {
throw err;
}else{
connection.query('SELECT * FROM cash_user WHERE uid='+results[0].uid+'',
function selectCb(err, resultss, fields) {
if (err) {
throw err;
}else{
connection.query("SELECT * FROM cash_daily_coin WHERE uid_fk="+results[0].uid+"",
function selectCb(err, daily, fields) {
if (err) {
throw err;
}else{
var datas = resultss[0];
datas.deviceid = deviceid;
datas.todaycoin = daily[0].todaycoin;
req.session["user"] = datas;
res.jsonp(datas);//返回JSON
}
}
);
}
}
);
}
}
);
8 回复
首先我觉的你代码需要格式化一下。然后这种嵌套问题你可以看一下async和bluebird的文档都是解决嵌套的,比如async的waterfall方法
async.waterfall([
function(callback){
conn.query('sql语句',function(err,results){
callback(err, results);
});
},function(data,callback) {
conn.query('sql语句',function(err,results){
callback(err,data,results)
});
}
], function (err,data,data2) {
if(err) {
console.log(err);
}else {
//todo
}
});
死月注:你的代码好像也没格式化啊。
首先,LZ要把代码缩进一下啊,要不别人怎么帮你看。
第二,从大意上看,你需要了解一下async或者Promise,Node.js是异步的,处理这些SQL也是异步的。而一般大家的逻辑思维和业务流程是同步的,所以你可能需要类似这样的东西。
第三,按照你的问题的思路回答,彻底解决嵌套问题,是做不了的,即:
// 先做第一个sql
var query1 = connection.query(sql1);
var result1 = doSth(query1);
// 再做第二个sql
var query2 = connection.query(sql2);
var result2 = doSth(query2);
上面这种想法和思路是同步思维,在Node里面做不了,你需要研究一下async类似的这种方式。至于异步到底适不适合做同步的流程,已经老生常谈的话题。