多变量socket.io发出的问题

时间:2019-12-25 19:28:37

标签: javascript node.js sockets socket.io

因此,我跟踪了几个有关类似问题的问题,但是,这些问题及其适当的解决方案来自多年前,从那时起,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 = "<?=$_SESSION['userName'];?>"
    var userTag = "<?php if($userRank == 7) { echo "[Owner]";} elseif ($userRank == 3) { echo "[Mod]";} elseif ($userRank == 5) { echo "[Admin]";} else {}?>"
    var userPicture = "<?=$userPicture?>"
            $('.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($('<li><img src="'+ postpiclink + '"class="chatMessageUserPicture"><h2 class="chatUserName">' + sendertag + sendname + '</h2>').text(sendmessage));
            });

据我所知,该格式应正确设置,但是当我尝试发送聊天消息时,以下消息将出现在服务器终端上:

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

ReferenceError: username is not defined

我并没有完全死脑筋,所以很明显它在套接字发出它时没有收到用户名变量,但是我不知道为什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在客户端中执行此操作时:

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对象,然后又在同一条消息中再次发送三个单独的属性。实际上,您要两次发送这三个属性。