我是nodejs的新手。
我希望我的代码能够多次查询数据库,从一个变量中的所有查询中收集数据,然后在某处使用它。
但我想nodejs而不是等待查询的结果,执行没有阻塞。 这就是我认为正在发生的事情。对不起,如果我错了。
for (var i = step_min; i < (step_max); i += step) {
query = 'select count(' + colName + ') as num_count from ' +
rows[0].tablename + ' where ' + 'dictionaryid=' +
rows[0].dictionaryid + ' and ' + colName + ' between ' + i +
' and ' + (i + step);
connection.query(query, function(err, rows1, fields) {
if (err) {
console.log(err);
throw err;
}
try {
console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count);
contents.push(rows1[0].num_count);
console.log('contents : '+ contents+'\n');
} catch (e) {
if (e instanceof SyntaxError) {
console.log("Syntax Error for input function");
}
}
});
console.log("##################### " + query + "\n");
console.log('contents : '+ contents+'\n');
}
关于如何阻止nodejs直到获得查询结果的任何建议,或者重新构建我的代码的方法?
提前致谢。
答案 0 :(得分:2)
你是正确的,它不会在执行前等待你的查询。您可以查看可用于对查询进行排队的node-mysql-queues模块,并在执行所有模块后执行给定的回调(它还允许您执行事务处理)
另一种(黑客)方法是设置您正在执行的查询数量的计数器。在每个事务的回调中,将结果保存到返回对象中并递减计数器。如果它是&lt; = 0则所有查询都已完成,您可以使用返回对象执行主回调。
另外,请注意SQL注入。
答案 1 :(得分:1)
试试这个: https://github.com/luciotato/waitfor
使用wait.for:你的代码
for (var i = step_min; i < (step_max); i += step) {
query = 'select count(' + colName + ') as num_count from ' +
rows[0].tablename + ' where ' + 'dictionaryid=' +
rows[0].dictionaryid + ' and ' + colName + ' between ' + i +
' and ' + (i + step);
var rows1 = wait.forMethod(connection,"query",query); //waits until callback
console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count);
contents.push(rows1[0].num_count);
}
console.log("##################### " + query + "\n");
console.log('contents : '+ contents+'\n');
} catch (e) {
if (e instanceof SyntaxError) {
console.log("Syntax Error for input function");
}
....
}
答案 2 :(得分:0)
做下面的事情可能是一种解决方法。
//它只是一个测试代码,无论我想到的是什么,所以我稍后会调整它......
var contents = [];
var lock = 0;
for (var i = step_min; i < (step_max + step); i += step) {
lock++;
}
for (var i = step_min; i < (step_max + step); i += step) {
query = 'select count(' + colName + ') as num_count from ' + rows[0].tablename + ' where ' + 'dictionaryid=' + rows[0].dictionaryid + ' and ' + colName + ' between ' + i + ' and ' + (i + step);
connection.query(query, function(err, rows1, fields) {
if (err) {
console.log(err);
throw err;
}
try {
console.log("$$$$$$$$$$$$$$$ pushed : " + rows1[0].num_count);
contents.push(rows1[0].num_count);
console.log('contents : ' + contents + '\n');
} catch (e) {
if (e instanceof SyntaxError) {
console.log("Syntax Error for input function");
}
}
lock--;
if (lock == 0) {
queryDone();
}
});
}
function queryDone() {
console.log("##################### " + query + "\n");
console.log('contents : ' + contents + '\n');
var id = obj.exptID + '.' + obj.exptITR + '.' + obj.nodeID + '.' + obj.resourceName + '.' + colName;
serie = {
name: colName,
data: contents,
id: id
};
console.log("--------------------\n " + step_max + "\n" + step_min + "\n------------------------\n");
}
该方法是在所有查询完成时触发一个函数,如Nick所说......