NodeJS mysql同步查询

4

我想在Node.js中运行同步查询,就像这样...

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… 我想运行同步查询。
4个回答

4
您可能无法在阻塞线程的意义上同步使用此函数(也不应该这样做!),但如果您使用数据库连接的承诺版本(使用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中使用占位符而不是字符串拼接。我没有修复你代码方面的问题 - 有关更多详细信息,请参见这些答案:


0

您可以创建一个返回 Promise 的包装器。使用 await 您可以使其同步:

function promiseWrapper() {
    return new Promise((resolve, reject) => {
        conn.query("SQL_QUERY", queryCallback(resolve, reject);
    }
}

function queryCallback(err, row){
    return (resolve, reject) {
        resolve(row);
    }
}

0

你应该使用 bluebird npm 模块来解决这个问题。使用 npm install 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);
    })

这样做行不通。你正在一个forEach回调中返回Promise.all(Rows),它会在每次迭代时运行一次,并忽略其返回值。此外,你正在对一个不包含promise的数组运行Promise.all。它到底应该做什么呢? - rsp

0

你也可以使用async模块。

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")
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接