如何在node.js中的异步和条件循环中执行嵌套查询

时间:2018-06-15 11:12:02

标签: node.js postgresql express async.js

我正在为我的项目使用node.js,express和postgres db。我在异步函数中几乎没有查询,我无法在序列中执行。示例代码供参考。

for(let i=0;i<person_size;i++)
{
    var check_person_query="select per_id_pk from person_tbl where per_fname='"+person_fname[i]+"' and per_lname='"+person_lname[i]+"'";

    dbClient.query(check_person_query,function(err,result){
        if(result.rows.length>0)
        {
            console.log("Call: 1.1");
            console.log("person already exists");
        }
        else
        {
            var insert_person_query = "insert into person_tbl (per_fname,per_lname,per_gender,profile_photo) values('"+person_fname[i]+"','"+person_lname[i]+"','"+person_gender[i]+"','profile_photo_link')";
            //console.log("query2: "+insert_person_query);
            dbClient.query(insert_person_query,function(err,result){
                    if (err) throw err;
                    console.log("Call: 1.2");
                    console.log("New person has been added");       
            });

            var fullname = person_fname[i].concat(person_lname[i]);
            low_fullname = fullname.toLowerCase();

            person_pic[i].mv("/home/aniket/content_info/images/"+low_fullname+".jpg", function(err){
                if (err) throw err;
            });                                             
        }
    });
}//end for 

在上面的代码中,当if条件失败时,else部分在我的async.series函数的最后执行。只要条件成功,一切都按顺序完美运行。如何顺序运行嵌套的数据库查询?我使用过async.waterfall但仍然没有预期的输出。

更新:(已解决)

我没有使用嵌套查询函数,而是删除了嵌套,并准备了一个查询,以便获得预期结果并维护执行顺序。

2 个答案:

答案 0 :(得分:0)

试试这个,我刚刚在查询函数的回调中移动了图像处理代码,所以它应该按顺序运行。

for(let i=0;i<person_size;i++)
    {
        var check_person_query="select per_id_pk from person_tbl where per_fname='"+person_fname[i]+"' and per_lname='"+person_lname[i]+"'";

        dbClient.query(check_person_query,function(err,result){
        if(result.rows.length>0)
        {
            console.log("Call: 1.1");
            console.log("person already exists");
        }
        else
        {
            var insert_person_query = "insert into person_tbl (per_fname,per_lname,per_gender,profile_photo) values('"+person_fname[i]+"','"+person_lname[i]+"','"+person_gender[i]+"','profile_photo_link')";
            //console.log("query2: "+insert_person_query);
            dbClient.query(insert_person_query,function(err,result){
            if (err) throw err;
            console.log("Call: 1.2");
            console.log("New person has been added");

            var fullname = person_fname[i].concat(person_lname[i]);
            low_fullname = fullname.toLowerCase();

            person_pic[i].mv("/home/aniket/content_info/images/"+low_fullname+".jpg", function(err){
                if (err) throw err;
            });
        });

        }
    });
    }//end for 

答案 1 :(得分:0)

您实际上应该只使用async / await。 pg lib supports promises,因此您可以执行以下操作:

for(let i=0;i<person_size;i++) {
  const result = await dbClient.query(check_person_query);
  if(result.rows.length <= 0) {
    await dbClient.query(insert_person_query);
  }
}

有关using for loops with async/await的更多信息。