mongoose (または、sequelize、または redis) クエリの非同期の性質を考えると、ビューをレンダリングする前に複数のクエリを作成する必要がある場合はどうすればよいでしょうか?
たとえばuser_id
、セッションに があり、 を介してその特定のユーザーに関する情報を取得したいとしますfindOne
。ただし、最近ログインしたユーザーのリストも表示する必要があります。
exports.index = function (req, res) {
var current_user = null
Player.find({last_logged_in : today()}).exec(function(err, players) {
if (err) return res.render('500');
if (req.session.user_id) {
Player.findOne({_id : req.session.user_id}).exec(function(err, player) {
if (err) return;
if (player) {
current_user = player
}
})
}
// here, current_user isn't populated until the callback fires
res.render('game/index', { title: 'Battle!',
players: players,
game_is_full: (players.length >= 6),
current_user: current_user
});
});
};
最初res.render
のクエリ コールバックも同様です。findOne
しかし、このユーザーを知っているかどうかを確認するためにからの応答を待つのはどうでしょうか? 条件付きでのみ呼び出されるためrender
、いずれかの条件で複製しない限り、内側のコールバック内に配置することはできません。かわいくない。
私はいくつかの回避策を考えることができます -
実際に非同期にし、クライアント側で AJAX を使用して現在のユーザーのプロファイルを取得します。しかし、これは価値があるよりも多くの作業のようです。
を使用し、レンダリングの前
Q
にクエリの解決を待つことを約束します。findOne
しかしある意味では、これは私の操作で応答を待機させるためにブロックを強制するようなものです。正しくないようです。ミドルウェア関数を使用して現在のユーザー情報を取得します。これはよりきれいに見え、クエリを再利用可能にします。ただし、どうすればよいのか、それとも同じ問題が引き続き発生するのかはわかりません。
もちろん、より極端なケースでは、作成するクエリが多数ある場合、状況が悪化する可能性があります。では、この種の要件が与えられた通常のパターンは何ですか?