Javascript nodejsmysql同步查询
我想像这样在NodeJ中运行同步查询Javascript nodejsmysql同步查询,javascript,mysql,node.js,asynchronous,synchronization,Javascript,Mysql,Node.js,Asynchronous,Synchronization,我想像这样在NodeJ中运行同步查询 for (var i in data){ conn.query("Select 1 from user where userid="+data[i].id,function(err,row){ Rows.push(row); }); } console.log(Rows); 在这个代码块中,我的行始终变为null。。。我想运行sync query您可能无法在线程阻塞的意义上(您也不应该!)同步使用这样的函数,但如果您使用承诺版本的数据库连接
for (var i in data){
conn.query("Select 1 from user where userid="+data[i].id,function(err,row){
Rows.push(row);
});
}
console.log(Rows);
在这个代码块中,我的行始终变为null。。。我想运行sync query您可能无法在线程阻塞的意义上(您也不应该!)同步使用这样的函数,但如果您使用承诺版本的数据库连接(使用Bluebird的promisifyAll或npm上提供的特定承诺版本的mysql驱动程序)和新的async/await语法,您可能会接近这一点(或基于生成器的协同路由,用于早于Node 7.x的平台,其中async/await不可用-另一种选择是使用Babel进行传输) 示例-您可以使用如下代码:
for (var i in data) {
let row = await conn.query("Select 1 from user where
userid="+data[i].id);
Rows.push(row);
}
console.log(Rows);
但如果它可以并行运行,那么类似这样的操作将更高效、更短:
let Rows = await Promise.all(data.map(item =>
conn.query("Select 1 from user where userid=" + item.id));
console.log(Rows);
有关该主题的更多详细信息,请参阅:
async
关键字声明的函数中使用
警告:您的代码可能容易受到SQL注入攻击。您应该在SQL中使用占位符而不是字符串连接。我没有修复代码的这一方面-有关详细信息,请参阅这些答案:
- 您应该使用
bluebird
npm
模块来解决这个问题。使用npm安装bluebird
来安装bluebird
var Promise = require('bluebird');
var Rows= [];
data.forEach(function (obj) {
conn.query("Select 1 from user where userid="+obj.id,function(err,row){
Rows.push(row);
});
});
return Promise.all(Rows);
})
您还可以使用异步模块
var async= require('async')
async.eachSeries(arr, function(index, callback){
conn.query("Select 1 from user where userid="+index,
function(err,res) {
if (err) {
return console.error('error running query', err);
}else{
Row.push(res);
}
callback();
});
},function(err){
if(err)
return err;
console.log("all queries executed")
});
您可以制作一个返回承诺的包装器。使用wait
可以使其同步:
function promiseWrapper() {
return new Promise((resolve, reject) => {
conn.query("SQL_QUERY", queryCallback(resolve, reject);
}
}
function queryCallback(err, row){
return (resolve, reject) {
resolve(row);
}
}
这将不起作用。您正在forEach回调中返回Promise.all(Rows)
,该回调对每个迭代运行一次,其返回值将被忽略。此外,您正在不包含promises的数组上运行Promise.all
。它到底应该做什么?