2013-12-20 25 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來假冒你的名字,所以這是爲了測試,您不應該將其用於生產。