async.each表插入麻烦?

时间:2016-10-19 13:51:48

标签: node.js express asynchronous

我使用async.each编写了一个代码,用于将数据插入表中。

     var categoryList = [{"categoryName": "biriyani","productName":"chicken biriyani"}, {"categoryName":"biriyani","productName":"mutton biriyani"}]
    async.each(categoryList, function(item,callback) 
    {
      var categoryName=item.categoryName;
      var productName=item.productName;
      var categoryCheckQuery =  pgFormat("select * from shop where categoryName LIKE '%"+categoryName+"%'");
      model.client.query(categoryCheckQuery,function (err,result) {
        if(result.rowCount==0){
          var insertCategoryQuery = pgFormat("insert into shop(categoryName)values(%L)",categoryName);
            model.client.query(insertCategoryQuery,function (err,result) {
             if (!err) {
              console.log("success");
              }
           });
         }
       else{
             //insert product into product table
            }
    });

解释

1)这里首先将包含categoryName-> biriyani的Json数组输入到商店表中

2)当async.each获取包含categoryName-> biriyani的下一个json数组时, categoryCheckQuery检查商店表是否已存在categoryname ='biriyani'。

3)如果存在则不会保存

问题:

这里对于数据result.rowCount ==0和具有categoryname = biriyani的数据都输入到商店表中。

1 个答案:

答案 0 :(得分:1)

此代码中存在几个问题。

  • 一个是使用async.each(),应该使用async.eachSeries()而不是async.each(),因为categoryList中下一个项的操作取决于当前项的操作。 async.eachSeries()确保在继续下一个项目之前完成第一个项目。

  • 另一个是async.each()'应该调用callback()来表示你已经完成了它。

以下是修订后的代码:

var categoryList = [{"categoryName": "biriyani","productName":"chicken biriyani"}, {"categoryName":"biriyani","productName":"mutton biriyani"}]

// Use async.eachSerices() instead of async.each()
async.eachSeries(categoryList, function(item,callback) {
    var categoryName = item.categoryName;
    var productName = item.productName;
    var categoryCheckQuery = pgFormat("select * from shop where categoryName LIKE '%" + categoryName + "%'");
    model.client.query(categoryCheckQuery, function (err, result) {
        if (result.rowCount == 0) {
            var insertCategoryQuery = pgFormat("insert into shop(categoryName)values(%L)", categoryName);
            model.client.query(insertCategoryQuery, function (err, result) {
                if (!err) {
                    console.log("success");
                }

                // passing non-null if you want to stop async.eachSeries() in case of error
                callback(null);    // <<<<< need to call async.each()'s callback() here
            });
        }
        else {
            //insert product into product table

            doInsert(params, function(err, result) {
                callback(null); // <<<<< need to call async.each()'s callback() here
            });
        }
    });
});

此外,检查返回的错误可能是一种很好的做法..在这种情况下特别是model.client.query()