Q:

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.

A:

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

