Javascript 使用Node_redis调用Node.js
我仍在尝试进入node.js,可能有些地方不太对劲。我要做的是首先查询一个包含房间列表的hmap。此列表将通过迭代获得每个房间的详细信息,如房间名称等 以下是查询应返回的内容:Javascript 使用Node_redis调用Node.js,javascript,node.js,callback,redis,Javascript,Node.js,Callback,Redis,我仍在尝试进入node.js,可能有些地方不太对劲。我要做的是首先查询一个包含房间列表的hmap。此列表将通过迭代获得每个房间的详细信息,如房间名称等 以下是查询应返回的内容: redis 127.0.0.1:6379> lrange rooms 0 -1 1) "room:5000" 及 这是routes.index中的函数 exports.index = function(req, res){ var render_rooms = new Array(); req
redis 127.0.0.1:6379> lrange rooms 0 -1
1) "room:5000"
及
这是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来实现这一点。此外,我还提出了将所有房间细节存储在一个数组中的想法,我期待着将其发送到视图中。显然,列表总是不显示任何元素,因为我想在填充列表之前会调用这些元素,因为我缺少一些基本的回调功能。但是我不能把它摆弄进去。有人能更详细地解释一下它“应该”是如何工作的吗?您的基本问题是需要等待渲染
渲染房间
阵列,直到所有异步处理完成。按照现在编写的方式,res.render
在任何异步Redis查询完成之前被调用
大概是这样的:
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
});
}
}
});
});
}
});
};
一旦你对这项工作感到满意,就看看如何使用或哪种更干净地支持这种类型的流来清理它。thx,我希望一些避免计数的方法能够奏效。我还将了解异步。
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
});
}
}
});
});
}
});
};