小白求解~~~~~nodejs+mysql怎么解决嵌套connection.query问题
发布于 9 年前 作者 liuyang9189 11237 次浏览 最后一次编辑是 8 年前 来自 问答
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
                                        }
                                    }
                                );
                            }
                        }
                    );
                }
            }
        );
12 回复

首先我觉的你代码需要格式化一下。然后这种嵌套问题你可以看一下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类似的这种方式。至于异步到底适不适合做同步的流程,已经老生常谈的话题。

1、generator,promise,co(es6) 2、bluebird,thunkify(es5) 3、async await(es7)

@alsotang 突然发现没法编辑他的帖子了 0. 0

你们都曲线救国么

function once(sql,cb){
	pool.getConnection(function(err,con){
		if(err){throw err};
		con.query(sql,function(err,result){
			con.release();
		  	if(err){throw err}
		  	cb(result)
		})	
	})
}
once(sql,function(result1){
	once(sql2,function(result2){
		theEnd()
	})
})
function theEnd(){
	//balabala
}

你们这帮人,一回答问题就是一堆三方库,让别人怎么学原理。

@xadillax 现在好了~上次忘记加了 sorry。。。

@mcc285361464 谢谢,已经使用async

@echoloyuk 迟来的感谢,已通过async解决。

@wfsovereign 迟来的感谢,已通过async解决。

@MiguelValentine 迟来的感谢,已通过async解决。

回到顶部