2014-06-27 38 views
0

我有一个Node, Express, and Websockets聊天应用程序。聊天室中当前用户的用户名存储为Redis。从我在SMEMBERS 'onlineUsers'键入redis-cli,我找回所有的用户目前在房间列表:Redis与节点

127.0.0.1:6379> smembers 'onlineUsers' 
1) "jackson" 
2) "bubba yump" 
3) "dog" 
4) "rumba" 
5) "buba" 

在我的主要应用javascript文件我有一个方法来获得当前用户这样我就可以显示出来在页面上:

var showCurrentUsers = function(){ 
    $('#list_of_users').empty(); 
    $.getJSON('getUsers', function(data){ 
     console.log(data) 
     for (var i in data){ 
      $('#list_of_users').append("<li> User: "+data[i]+"</li>") 
     } 
    }); 
} 

在我Node服务器上的文件我也有匹配的路由,但db.smembers保持返回true,而不是用户的列表。

app.get('/getUsers', function(req,res){ 
    res.send(getOnlineUsers()); 
}); 

// REDIS DATA 
var getOnlineUsers = function(){ 
    return db.smembers("onlineUsers") 
} 

,这里是其中的用户名是最初发布到数据库:

client.on("setUsername", function(user){ 
      pub.publish("chatting","A new user in connected:" + user); 
      db.sadd("onlineUsers",user); 
     } 
    ); 

我知道用户名是否正确张贴到数据库中,我可以从redis-cli访问他们,但我我不知道为什么我的JSON调用返回true而不是列表。

回答

1

(我假设你正在使用https://github.com/mranney/node_redis

节点Redis的客户端是异步。您可以将其视为写入和删除的同步,但要从db读取,您需要使用回调。

app.get('/getUsers', function(req, res, next){ 
    getOnlineUsers(function (err, onlineUsers) { 
    if (err) { 
     return next(err); 
    } 
    res.send(onlineUsers); 
    }); 
}); 

// REDIS DATA 
var getOnlineUsers = function(cb){ 
    return db.smembers("onlineUsers", cb); 
} 
+1

作为一个说明了'db.sadd(“onlineUsers”,用户);'可以用一个回调,如果你需要确认写入成功,如:'db.sadd(“onlineUsers”被写入,用户功能(err){if(err){handle(err);}});' – generalhenry