使用node-mysql和mysql-queue将多个查询结果发送到res.render()

时间:2013-04-28 13:33:29

标签: node.js node-mysql

我[新node.js和一般编程]有两个mysql查询结果(成员信息和成员可以参加的研讨会列表),需要将它们发送到res.render().jade模板(会员编辑页面)中显示。

为此,我使用node-mysqlmysql-queue个模块。问题是我不知道如何在queue.execute()完成之前传递回调函数来呈现响应所以我做了解决方法并将前两个查询放入队列(mysql-queue功能),执行队列,然后添加第三个“虚拟查询”,它具有呈现模板的回调函数。

我的问题是我可以使用此解决方法以及使用此模块的正确方法吗?

exports.memberEdit = function (req, res) {

    var q = connection.createQueue();

    var membersResults,
        htmlDateSigned,
        htmlBirthDate,
        servicesResults;

    q.query("SELECT * FROM members WHERE id= ?;", req.id, function (err, results) {
      console.log("Članovi: " + results[0]);
      membersResults = results[0];
      htmlDateSigned = dater.convertDate(results[0].dateSigned);
      htmlBirthDate = dater.convertDate(results[0].birthDate);
    });

    q.query("SELECT * FROM services", function (err, results) {
      console.log("Services: " + results);
      servicesResults = results;
    });

    q.execute();

    // dummy query that processes response after all queries and callback execute 
   // before execute() statement
    q.query("SELECT 1", function (err,result) {
    res.render('memberEdit', { title: 'Edit member', 
                               query:membersResults, 
                               dateSigned:htmlDateSigned,   
                               birthDate:htmlBirthDate,
                               services:servicesResults }); 
})
};

1 个答案:

答案 0 :(得分:1)

我认为另一种方法是使用transaction来包装您的查询:

var trans = connection.startTransaction();
trans.query(...);
trans.query(...);
trans.commit(function(err, info) {
  // here, the queries are done
  res.render(...);
});

commit()会调用execute() ,它会提供一个回调,当所有查询回调都完成后,将会调用该回调。

这仍然是一个变通方法,如果execute()提供传递回调的选项(但事实并非如此)会更有意义。或者,您可以使用提供Promise实现的模块,但这仍然是一种解决方法。