【问题标题】:Problems with multiple variable socket.io emits多个变量 socket.io 发出的问题
【发布时间】:2020-04-16 06:36:37
【问题描述】:

所以我关注了几个关于类似问题的问题,但是,这些问题及其适当的解决方案来自多年前,从那时起,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

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

【问题讨论】:

  • 在调用io.emit() 之前,您必须向我们展示username 变量的定义位置以及应该设置它的代码。您没有向我们展示任何代码,因此我们不知道为什么没有定义它,除非您从未在此范围内定义变量。我希望你意识到通过 socket.io 接收一些数据并不会自动定义任何你可以引用的变量,就像你使用 username 一样。
  • 您是否应该引用msg.username 而不仅仅是username
  • 可能吗? socket io 是否获取了套接字发出的整个对象并将其设置为 msg?我确实在网页上显示了用户名变量的定义位置,至少是重要的部分,当检查这些变量时,它们取了它们需要的值,所以这些不是问题。我怀疑您使用 msg.username 进行某些操作,所以我会仔细检查是否有任何调整可以解决问题。很快就会更新。

标签: javascript node.js sockets socket.io


【解决方案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 对象然后在同一条消息中再次发送三个单独的属性是多余的。您实际上是两次发送这三个属性。

【讨论】:

  • 谢谢您,我在您对帖子的初始评论后忘记发表评论,但我使用 msg.username 扩展名进行了更改,它按预期工作,但非常感谢您的帮助!
猜你喜欢
  • 2021-03-02
  • 1970-01-01
  • 2021-05-30
  • 2021-01-24
  • 2020-04-22
  • 2015-11-22
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多