鉴于 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
在渲染之前等待查询的解决。但在某种程度上,这就像强制阻止以使响应等待我的操作。似乎不对。使用中间件函数获取当前用户信息。这看起来更干净,使查询可重用。但是我不确定如何去做,或者它是否仍然会出现同样的问题。
当然,在更极端的情况下,如果您要进行十几个查询,事情可能会变得很糟糕。那么,考虑到这种类型的要求,通常的模式是什么?