Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

async.each table insertion trouble?

I wrote a code using async.each for inserting data into tables.

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

Explanation:

1)Here first Json array containing categoryName->biriyani is entered into shop table

2)when async.each fetching next json array containing categoryName->biriyani, categoryCheckQuery checks the shop table whether categoryname = 'biriyani' is already exists.

3)If exists it wont be saved

Problem:

Here for both the data result.rowCount ==0 and both the data which have categoryname = biriyani is entered into shop table.

like image 800
midhun k Avatar asked May 19 '26 23:05

midhun k


1 Answers

There are couple problems in this code.

  • One is the use of async.each(), async.eachSeries() should be used instead of async.each() because the operation of the next item in categoryList depends on current item's operation. async.eachSeries() ensures that first item is done before moving on to next item.

  • Another is async.each()'s callback() should be called to signal it that you're done with it.

Here is the revised code:

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

Also, it's probably good practice to check for error returned.. specifically model.client.query() in this case

like image 83
Ben Avatar answered May 22 '26 15:05

Ben



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!