Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejsmysql同步查询_Javascript_Mysql_Node.js_Asynchronous_Synchronization - Fatal编程技术网

Javascript nodejsmysql同步查询

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您可能无法在线程阻塞的意义上(您也不应该!)同步使用这样的函数,但如果您使用承诺版本的数据库连接

我想像这样在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

您可能无法在线程阻塞的意义上(您也不应该!)同步使用这样的函数,但如果您使用承诺版本的数据库连接(使用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
      。它到底应该做什么?