2013-05-15 95 views
2

我使用Node.js构建服务器。我将代表我的用户的对象存储在关联数组中,现在这些对象的索引是该连接的套接字标识。使用Socket.io库,我通过简单地执行socket.id获得它,因此对于每个处理程序来说,照顾我的请求,我总是可以知道哪个用户提出了请求。关联数组中的双重索引

客户端每个用户都有连接用户的ID(与套接字ID不同)。 问题aiaises当我有一个处理程序,用于发送消息从用户到另一个,我举一个例子:

用户A需要发送一条消息给用户B,我的协议指定消息为类似这样的:

MSG_KEY:{MSG:'hello world',USER_ID:'12345'} 

服务器端我有听的处理程序“MSG_KEY”,当它被执行,并使用socket.id我可以检索谁提出的要求,但在发送邮件的问题是,我需要得到用户B,但是这次使用他的USER_ID。我不想使用socket.id来避免会话欺骗。

我首先想到了在我的数组中索引用户的索引,他们都是通过从socket.id和用户ID中索引它们。

我的问题是:这样做是个好主意吗? socket.io是否提供了一种简化此方法的方法?

+0

FWIW,在JavaScript,通常不会使用术语“关联数组”(只是为了避免与数组混淆 - 这很有趣,因为标准的JavaScript数组并不是真正的数组,而是没关系)。 “地图”或只是“对象”是正常的术语。 –

+0

感谢您的澄清 – MastErAldo

+0

只是为了澄清:您的问题下方有一个[编辑](http://stackoverflow.com/posts/16572324/edit)链接,您可以使用它来随时编辑您的帖子。其他用户也可以这样做,这就是为什么我添加了你说的缺失的部分。而且我没有添加“谢谢”部分,因为这里被认为是不必要的噪音。 – bfavaretto

回答

1

没有特别的理由,你不能这样做。我会使用两个单独的对象(地图),并且可能让用户由对象而不是字符串表示,以便实际上只有一个用户(从两个地方引用)。

例如,一个用户:

var user = {userid: "JohnD", name: "John Doe"}; 

然后:

var usersByID = {}; 
usersByName[user.userid]; 

var usersBySocket = {}; 
usersBySocket[theSocketID] = user; 

甚至

var users = { 
    byID:  {}, 
    bySocket: {} 
}; 

users.byID[user.userid] = user; 
users.bySocket[theSocketID] = user;