SQL查询,每个查询具有异步

SQL查询,每个查询具有异步,sql,node.js,asynchronous,Sql,Node.js,Asynchronous,我的问题是,当我获取用户数组并尝试运行异步时,它会启动每个sqlRequest,而不是逐个推入数组 它应该逐个执行SQLRequest1,而不是每个用户都执行sqlRequest和数组中的推送 这里有一个异步的 function getUserFavCat(params, callback) { var usersArrayCat = []; async.each(params, function (user, cb) { sqlRequest("SELECT b_cat.tit

我的问题是,当我获取用户数组并尝试运行异步时,它会启动每个sqlRequest,而不是逐个推入数组

它应该逐个执行SQLRequest1,而不是每个用户都执行sqlRequest和数组中的推送

这里有一个异步的

function getUserFavCat(params, callback) {
  var usersArrayCat = [];
  async.each(params, function (user, cb) {
    sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) {
      if (!result) {
        //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user))
      } else if (result.length == 0) {
        //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user))
      } else {
        user.favouriteCat = utils.takeMostRepeatingObj(result);
        usersArrayCat.push(user);
      }
      cb();
    })
  }, function() {
    callback(null, usersArrayCat)
  });
};
以下是SQL查询:

function sqlRequest (sqlQuery, callback) {
  var connection = new sql.Connection(sql_conf, function (err) {
    if (err){
      console.log(err)
    } else {
      var request = new sql.Request(connection);
      request.query(sqlQuery, function(err, result) {
        console.log(result)
        if(err){
          console.error(err)
        } else if(!result){
          console.error("NO RESPONSE SQL QUERY")
        } else {
          callback(null, result);
          connection.close();
        }
      })
    }
  });
  connection.on('error', function(err) {
    console.log(err);
  });
};

通过使用async.map并对数组的每个回调进行推送,尝试这个技巧。然后,您可以使用async.parallel过滤成功用户的回调结果,并将其推送到usersArrayCat阵列

function getUserFavCat(params, callback) {
  var usersArrayCat = [], callbackArrays = [];
  async.map(params, function (user, cb) {
    callbackArrays.push(function (cb) {
       sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) {
       if (!result) {
         user.status = '99'; // error status
         cb(null, user);
       } else if (result.length == 0) {
         user.status = '99'; // error status
         cb(null, user);
       } else {
         user.favouriteCat = utils.takeMostRepeatingObj(result);
         user.status = '00'; //success status
         cb(null, user);
       }
     });
   }, function(err, results) {
     // comes here after all individual async calls have completed
     // check errors; array of results is in data
     cb(null, results)
   });

   async.parallel(callbackArrays, function (err, results) {
      results.forEach (function (elem, ind) {
        if (elem.status == '00') {
           usersArrayCat.push(elem);
        }
      });
   });
 };

使用
async.eachLimit
限制请求数量

function getUserFavCat(params, callback) {
    var usersArrayCat = [];
    console.log(`length of array ${params.length}`)
                        // 1 here means 1 request at a time
    async.eachLimit(params, 1, function (user, cb) {
        sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) {
            if (!result) {
                //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user))
            } else if (result.length == 0) {
                //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user))
            } else {
                user.favouriteCat = utils.takeMostRepeatingObj(result);
                usersArrayCat.push(user);
                cb();
            }
        })
    }, function (err) {
        if (err) return callback(err);
        callback(null, usersArrayCat)
    });
};

与您的问题无关,但不要这样构建查询-您选择了SQL注入漏洞。但我应该如何使用SQL查询执行循环?对不起,我指的是这部分
,其中st.id=“+user.id
。不要连接字符串。无论您使用什么库,它都应该允许您构建参数化查询,做到这一点。这没有帮助。问题是,它并不是一步一步地进行的,只有在每个用户继续查询之后,它才会进入回调