2013-05-15 2 views
2

Я строю сервер, используя Node.js. Я храню объекты, представляющие своих пользователей, в ассоциативном массиве, и теперь индекс этих объектов является идентификатором сокетов этого соединения. Используя библиотеку Socket.io, я получаю ее, просто делая socket.id, поэтому для каждого обработчика, который заботится о моих запросах, я всегда могу узнать, какой пользователь сделал запрос.Двойная индексация в ассоциативном массиве

На стороне клиента каждый пользователь имеет идентификаторы подключенных пользователей (отличных от идентификаторов сокета). Проблема возникает, когда у меня есть обработчик, который используется для отправки сообщения от пользователя другому, я делаю пример:

Пользователь A должен отправить сообщение пользователю B, мой протокол указывает сообщение как-то вроде это:

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

стороне сервера у меня есть обработчик, который прослушивает «MSG_KEY» и, когда сообщение посылается оно выполняется и с помощью socket.id я могу восстановить, который сделал запрос, но проблема заключается в том, что Мне нужно получить также пользователя B, но на этот раз его USER_ID. Я не хочу использовать socket.id, чтобы избежать спуфинга сеанса.

Сначала я подумал об индексировании в моем массиве пользователей, указав их как из socket.id, так и из идентификатора пользователя.

Мой вопрос: это хорошая идея? Содержит ли socket.io способ упростить это?

+0

FWIW, в JavaScript, термин «ассоциативный массив» обычно не используется (просто чтобы избежать путаницы с массивами - это весело, потому что стандартные массивы JavaScript на самом деле не массивы, но неважно). «Карта» или просто «объект» - это обычный термин. –

+0

Спасибо за разъяснение – MastErAldo

+0

Просто уточните: есть ссылка [http://www.photo.ru/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; 
Смежные вопросы