我使用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的数据都输入到商店表中。
答案 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()