我试图使用node-mysql模型和node.js在变量中保存MySql查询的结果,所以我有这样的代码:
connection.query("select * from ROOMS", function(err, rows){
if(err) {
throw err;
} else {
console.log(rows);
}
});
结果是:
[ { idRooms: 1, Room_Name: 'dd' },
{ idRooms: 2, Room_Name: 'sad' } ]
所以我需要将这个结果存储在变量中,所以我尝试这样:
var someVar = connection.query("select * from ROOMS", function(err, rows){
if(err) {
throw err;
} else {
return rows;
}
});
console.log(someVar);
但是没有工作,谢谢你事先提供任何帮助。
答案 0 :(得分:12)
嗯@Fadi,connection.query
是异步的,这意味着当您的console.log(someVar)
,someVar
来电尚未设置时。
你能做什么:
var someVar = [];
connection.query("select * from ROOMS", function(err, rows){
if(err) {
throw err;
} else {
setValue(rows);
}
});
function setValue(value) {
someVar = value;
console.log(someVar);
}
答案 1 :(得分:2)
您无法做到这一点,因为网络i / o在node.js中是异步和非阻塞的。因此,之后出现的任何逻辑必须在查询完成后才能执行,您必须将放在查询的回调中。如果您有许多嵌套异步操作,可以考虑使用async
之类的模块来帮助更好地组织异步任务。
答案 2 :(得分:2)
作为已经给出答案的补充。
var **someVar** = connection.query( *sqlQuery*, *callback function( err , row , fields){}* )
console.log(**someVar**);
此构造将返回此连接的 someVar 信息及其SQL查询。它不会从查询中返回值。
查询中的值位于回调函数(错误,行,字段)
中答案 3 :(得分:1)
如果要将变量分配给res.render
,这是您的答案//before define the values
var tum_render = [];
tum_render.title = "Turan";
tum_render.description = "Turan'ın websitesi";
//left the queries seperatly
var rastgeleQuery = "SELECT baslik,hit FROM icerik ORDER BY RAND() LIMIT 1";
var son5Query = "SELECT baslik,hit FROM icerik LIMIT 5";
var query_arr = [rastgeleQuery, son5Query];
var query_name = ['rastgele', 'son5'];
//and the functions are
//query for db
function runQuery(query_arr,sira){
connection.query(query_arr[sira], function(err, rows, fields) {
if (err) throw err;
var obj = [];
obj[query_name[sira]] = rows;
sonuclar.push(obj);
if (query_arr.length <= sira+1){
sonuc();
}else{
runQuery(query_arr, sira+1);
}
});
}
//the function joins some functions http://stackoverflow.com/questions/2454295/javascript-concatenate-properties-from-multiple-objects-associative-array
function collect() {
var ret = {};
var len = arguments.length;
for (var i=0; i<len; i++) {
for (p in arguments[i]) {
if (arguments[i].hasOwnProperty(p)) {
ret[p] = arguments[i][p];
}
}
}
return ret;
}
//runQuery callback
function sonuc(){
for(var x = 0; x<=sonuclar.length-1; x++){
tum_render = collect(tum_render,sonuclar[x]);
}
console.log(tum_render);
res.render('index', tum_render);
}