2013-12-20 23 views
0

我正在编写一个结合登录功能和实时聊天的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

socket.io让你读饼干:

// 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


更简单:

如果securit,则为

y是不是对你很重要,你可以设置用户名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来假冒你的名字,所以这是为了测试,您不应该将其用于生产。