处理来自多个登录的变量以进行实时聊天

时间:2013-12-20 11:47:07

标签: node.js mongodb socket.io

我正在编写一个结合了登录功能和实时聊天功能的nodejs服务器。当我尝试让所有登录并与我的实时聊天服务器连接的用户返回客户端(因此他们可以选择要与之聊天的特定用户)时出现问题。

这是我的登录功能代码。我声明了一个变量,所以当客户端请求/ doLogin时,用户名将存储在其中

var userLogged = {name: null, socketid: null};

app.post('/doLogin', function(req,res){
    db.users.findOne({username: req.body.username}, function(err, user) {
        if( err ) {
            console.log("Login fail");
        }
        else if (user != null) {
            if (req.body.password == user.password) {
                req.session.user_role = "user";
                userLogged.name = req.body.username;
            } else {
                req.session.user_role = "null";
            }
        }
        res.send({redirect: "/"});
    });

});

在实时聊天功能(使用Socket.io)中,当用户连接(登录后)时,我会将socket.id存储到变量之前,并将该变量保存在mongodb中。

io.sockets.on('connection', function(socket){
     var address = socket.handshake.address;
     userLogged.socketid = socket.id;

     db.clientList.save({name: userLogged.name, socketid: userLogged.socketid}, function(err, saved){
     });
    console.log("Connection " + address.address + " accepted.");
    //
    //
    socket.on('disconnect', function(){
        db.clientList.remove({socketid: userLogged.socketid});
    });
});

问题是,当其他用户登录时,变量会发生变化,因此我无法将正确的信息保存到数据库中。 请帮帮我!

1 个答案:

答案 0 :(得分:1)

socket.io允许您阅读cookie:

// app.js
io = io.listen(server);
io.set('authorization', function (handshakeData, accept) {
    handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);
});

正确的做法是:

cookies --> sessionID --> user --> username

文件:http://howtonode.org/socket-io-auth


更简单:

如果安全性对您不重要,您可以将用户名设置为cookie,然后在服务器中轻松读取用户名:cookies->username

// login handler
res.cookie('username', username)
res.send({redirect: "/"});

// io connection handler
io = io.listen(server);
io.set('authorization', function (handshakeData, accept) {
    console.log(handshakeData.headers.cookie)
}

请注意,任何网络用户都可以更改自己的Cookie以伪造您的姓名,因此这是为了测试,您不应该将其用于制作。