我仍然试图进入node.js并且可能会得到一些不太正确的东西。我正在寻找的目标是首先查询包含房间列表的hmap。这个列表将通过迭代来获取每个房间的更多细节,如房间名称等。
以下是查询应返回的内容:
redis 127.0.0.1:6379> lrange rooms 0 -1
1) "room:5000"
和
redis 127.0.0.1:6379> hgetall room:5000
1) "name"
2) "room1"
3) "admin"
4) "user:1001"
5) "public"
6) "true"
这是我在routes.index
中的功能exports.index = function(req, res){
var render_rooms = new Array();
req.app.settings.redis.lrange('rooms',0,-1, function(error, rooms) {
if (error) {
console.log('Error: '+ error);
}
else {
rooms.forEach(function(room){
console.log("room: " + room);
req.app.settings.redis.hgetall(room, function(error, roomdetails){
if (error) {
console.log('Error: '+ error);
}
else {
console.log("roomdetails: " + roomdetails.public);
if(roomdetails.public == "true"){
render_rooms.push(roomdetails.name);
}
}
});
});
// console.log('Name: ' + result);
// res.render('account', { title: 'account title', user: req.user.username, votes: result });
}
});
console.log("length: " + render_rooms.length);
res.render('index', { title: 'Index', username: req.user.username, rooms: render_rooms });
};
我不确定我是否正确使用node_redis来实现这一目标。此外,我想出了将所有房间细节存储在一个阵列中的想法,我希望将其发送到视图中。显然列表总是没有显示任何元素,因为我猜是在列表填充之前调用,因为我缺少一些基本的回调功能。无论如何我都无法摆弄它。有人可以更详细地解释一下它应该如何运作吗?
答案 0 :(得分:3)
您的基本问题是您需要等待呈现render_rooms
数组,直到所有异步处理完成。现在编写它的方式是,在任何异步Redis查询完成之前调用res.render
。
这样的事情:
exports.index = function(req, res){
var render_rooms = new Array();
req.app.settings.redis.lrange('rooms',0,-1, function(error, rooms) {
// Keep track of the number of rooms we have left to process.
var roomcount = rooms.length;
if (error) {
console.log('Error: '+ error);
}
else {
rooms.forEach(function(room){
console.log("room: " + room);
req.app.settings.redis.hgetall(room, function(error, roomdetails){
if (error) {
console.log('Error: '+ error);
}
else {
console.log("roomdetails: " + roomdetails.public);
if(roomdetails.public == "true"){
render_rooms.push(roomdetails.name);
}
// Render code moves to here and is only run after all rooms
// have been processed.
if (--roomcount === 0) {
console.log("length: " + render_rooms.length);
res.render('index', {
title: 'Index',
username: req.user.username,
rooms: render_rooms
});
}
}
});
});
}
});
};
一旦您对这方面的工作感到满意,请使用async.forEach
或async.forEachSeries
来清理它,以便更清洁地支持此类流程。