2017-02-26 28 views
1

我的問題是,當我得到用戶數組,並試圖運行異步每個啓動每個sqlRequest,而不是逐一推入數組。SQL查詢與異步每個

它應該通過1執行sqlRequest 1,而不是通過每個用戶執行sqlRequest和push數組。

這裏是一個異步每個

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); 
    }); 
}; 
+1

與您的問題沒有關係,但不建立這樣的查詢 - 你正在打開一個SQL注入漏洞。 –

+0

但我應該如何執行sql查詢循環? –

+0

對不起,我的意思是這個部分'WHERE st.id =「+ user.id'。不要連接你的字符串。無論你使用什麼庫,它應該讓你建立參數化查詢,做到這一點。 –

回答

1

使用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) 
    }); 
}; 
0

使用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); 
     } 
     }); 
    }); 
}; 
+0

不。沒有幫助,問題是它不會一步一步地進行,只有在每個用戶進行查詢之後纔會回調 –