Дорогие друзья У меня есть небольшая проблема, пытаясь отслеживать зарегистрированных пользователей в чате. Чат основан на два отдельных каналов, которые работают с помощью пространств имен:node.js/socket.io - отслеживать клиентов
chatInfra
- для ручки зарегистрированных пользователей и отправлять приветственные сообщения.chatCom
- для обработки сообщений между пользователями.
Я много искал, но нашел только теоретические объяснения, что наилучшим решением является хранение пользователей в массиве. Поэтому я попытался сохранить отслеживание зарегистрированных пользователей, сохранив их в массиве, а затем итерации через них, но результат не очень хорош.
Проблема заключается в том, что после входа в чат на экране появляется только первое зарегистрированное имя пользователя, тогда как второе имя пользователя не отображается.
Это мой код на стороне сервера, я пытаюсь сохранить пользователей в clients
массива:
var clients = [];
var chatInfra = io.of("/chat_infra").on("connection", function(socket){
socket.on("set_name", function (data) {
clients.push(data.name);
socket.emit('name_set', data);
socket.send(JSON.stringify({
type:'serverMessage',
message:'Welcome!'
}));
socket.broadcast.emit('user_entered', data);
});
});
var chatCom = io.of("/chat_com").on("connection", function (socket) {
socket.on('message', function (message) {
message = JSON.parse(message);
for(var key in clients){
if(message.type == "userMessage"){
message.username = clients[key];
console.log('message : ', message);
socket.broadcast.send(JSON.stringify(message));
message.type = "myMessage";
socket.send(JSON.stringify(message));
}
}
});
});
Вот как это выглядит в браузере: http://screencast.com/t/lshnfcGZ8E8
Вот полный код: https://gist.github.com/johannesMatevosyan/0b9f7e588338dbb6b7f5
спасибо за ответ, но он показывает неопределенное 'message.username = client.username;' значение. – johannesMatevosyan
Это проблема порядка исполнения, я думаю. У вас есть другие ошибки в коде клиента. Например, вы устанавливаете новых прослушивателей событий в обработчик события name_set каждый раз, когда вы получаете сообщение. – cviejo
Попробует обновить рабочую версию. – cviejo