1

[node.js初心者でプログラミング全般] には 2 つのmysqlクエリ結果 (メンバー情報とメンバーが参加できるワークショップのリスト) があり、それらをテンプレート (メンバー編集ページ)res.render()で提示するために送信する必要があります。.jade

これを行うには、モジュールを使用node-mysqlしてmysql-queueいます。問題は、コールバック関数を渡して終了前に応答をレンダリングする方法がわからないことです。そのqueue.execute()ため、回避策を講じ、最初の 2 つのクエリをキューに入れ (mysql-queue 機能)、キューを実行し、その後 3 番目の「ダミー クエリ」を追加しました。テンプレートをレンダリングするコールバック関数があります。

私の質問は、この回避策を使用できますか?このモジュールを使用する適切な方法は何ですか?

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 }); 
})
};
4

1 に答える 1

1

別の方法として、トランザクションを使用してクエリをラップする こともできると思います。

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

commit()が呼び出さexecute() 、すべてのクエリ コールバックが完了したときに呼び出されるコールバックが提供されます。

これはまだちょっとした回避策ですがexecute()、コールバックを渡すオプションを提供する方が理にかなっています (ただし、そうではありません)。または、Promise 実装を提供するモジュールを使用することもできますが、それでも回避策です。

于 2013-04-28T14:26:22.217 に答える