【问题标题】:How to wait for queries to get results while running nested mysql query in nodejs如何在nodejs中运行嵌套mysql查询时等待查询得到结果
【发布时间】:2015-08-24 14:21:38
【问题描述】:
  connection.query('SELECT * from enquiry', function(err, rows,  fields) {
 if (err) throw err;
  var enquiryJson=[];

  for (var i in rows) {
      var id=1,jsondata,message;

        connection.query('SELECT status_message from status where id='+rows[i].status_id, function(err, statusrows, field) {
          console.log(statusrows[0].status_message);
         message=statusrows[0].status_message;

      });

          jsondata={
          "id": id++,
          "name": rows[i].name,
          "mobile": rows[i].mobile,
          "city": rows[i].city,
          "state": rows[i].state,
          "nature_of_enq": rows[i].nature_of_enq,
          "status":  message
      };

      enquiryJson.push(jsondata);
}
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(enquiryJson));
  });
  });

我只是 nodejs 的初学者。我只想知道如何等待子查询返回结果?在上面的代码中,我试图设置一个 JSON 键(“状态”)值,该值将由子查询返回。但我总是将消息变量设为未定义。但是我在控制台中得到了消息变量。我认为节点服务器不会等待子查询的结果。有什么解决办法?提前致谢

【问题讨论】:

标签: mysql node.js


【解决方案1】:

您可以使用async.each。

这个想法是您执行第一个查询,并且在该查询内部您可以执行一个同步过程,该过程仅在一切结束时才结束。

您可以在https://github.com/caolan/async#each 阅读更多内容,在您的情况下,您可以从以下内容开始:

var getStatusMessage = function(row, callback){
    //Here yo do your query
    //SELECT status_message from status where id='+ row.status_id... bla bla bla
    //and you can update your json here
}

async.each(rows, getStatusMessage, function(err){
    if(err){
        //Something bad happened
    }
    //enquiryJson.push(jsondata);
    //res.setHeader
    //res.end ....
    //Wathever you wanna do after your queries ends

});

【讨论】:

  • 那我如何传递status_id?
  • @John,您不需要传递 status_id,getStatusMessage 函数将获取每一行并从那里迭代。为了澄清这一点,我已经更新了我的答案。
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 2014-08-26
  • 2019-05-25
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多