Поэтому я последовал за парой вопросов по аналогичному вопросу, однако, вопросы и их подходящие решения были получены несколько лет назад, и с тех пор в socket.io было несколько обновлений, которые делают их код непригодным для использования. Я пытался адаптировать его под v2.3.0, но он не работает.

Я пытаюсь создать приложение чата, в котором есть несколько переменных, которые я пытаюсь выдать с каждым событием io.emit (картинка, имя, тег, сообщение и т. Д.)

На данный момент мой серверный код выглядит так:

socket.on('chatMessage', function(msg){ io.emit('chatMessage', { sendmessage: msg, sendname: username, sendertag: tag, postpiclink: userpiclink }); console.log('message: '   sendmessage   sendname   sendertag   postpiclink); }); 

Очевидно, есть нечто большее, чем просто это, но это единственный релевантный код, а остальная часть функционирует так, как должно. На моей стороне клиента каждое событие отправляет все переменные (я полагаю) вместе с событием. Это выглядит так:

  var userName = "{amp}lt;?=$_SESSION['userName'];?{amp}gt;" var userTag = "{amp}lt;?php if($userRank == 7) { echo "[Owner]";} elseif ($userRank == 3) { echo "[Mod]";} elseif ($userRank == 5) { echo "[Admin]";} else {}?{amp}gt;" var userPicture = "{amp}lt;?=$userPicture?{amp}gt;" $('.chatMessageSubmitForm').submit(function(e){ e.preventDefault(); e.stopPropagation(); socket.emit('chatMessage', { message: $('#messageField').val(), username: userName, tag: userTag, userpiclink: userPicture}); $('#messageField').val(''); return false; }); socket.on('chatMessage', function(msg){ $('.chatMessageList').append($('{amp}lt;li{amp}gt;{amp}lt;img src="'  postpiclink   '"class="chatMessageUserPicture"{amp}gt;{amp}lt;h2 class="chatUserName"{amp}gt;'   sendertag   sendname   '{amp}lt;/h2{amp}gt;').text(sendmessage)); }); 

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

 io.emit('chatMessage', { sendmessage: msg, sendname: username, sendertag: tag, postpiclink: userpiclink }); ReferenceError: username is not defined 

Я не совсем придурок, поэтому очевидно, что он не получает переменную username, когда сокет ее генерирует, но я понятия не имею, почему. Любая помощь будет принята с благодарностью.

baddeveloper22

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,

Когда вы делаете это в клиенте:

 socket.emit('chatMessage', { message: $('#messageField').val(), username: userName, tag: userTag, userpiclink: userPicture}); 

Это означает, что когда вы получаете его на сервере здесь:

  socket.on('chatMessage', function(msg){ io.emit('chatMessage', { sendmessage: msg, sendname: username, sendertag: tag, postpiclink: userpiclink }); console.log('message: '   sendmessage   sendname   sendertag   postpiclink); }); 

Это означает, что msg будет весь отправленный вами объект. Итак, если вы хотите имя пользователя из этого объекта, вам нужно обратиться к:

 msg.username 

не просто

 username 

Итак, вы бы изменить на это:

 socket.on('chatMessage', function(msg){ io.emit('chatMessage', { sendmessage: msg, sendname: msg.username, sendertag: msg.tag, postpiclink: msg.userpiclink }); console.log('message: '   sendmessage   sendname   sendertag   postpiclink); }); 

К вашему сведению, избыточно отправлять весь объект msg а затем снова отправлять три отдельных свойства в одном и том же сообщении. По сути, вы отправляете эти три свойства дважды.