繁体   English   中英

NodeJS mysql同步查询

[英]NodeJS mysql sync query

我想在这样的nodejs中运行同步查询...

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 ...我想运行同步查询

您可能无法在线程阻塞意义上同步使用此类函数(也不应该!)但如果您使用数据库连接的承诺版本(使用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 module来解决这个问题。 使用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);
    })

您也可以使用异步模块。

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

您可以创建一个返回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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM