javascript - 多变量 socket.io 发出的问题

标签 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

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

最佳答案

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

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

关于javascript - 多变量 socket.io 发出的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481292/

相关文章:

javascript - 如何为 cucumber-js 中的每个功能文件指定步骤定义文件?

javascript - 如何比较两个日期,如果相等则在 JavaScript Angular 中给出 toastr ?

javascript - 新 web 项目上 javascript 配置的最佳实践

node.js - 使用 KeyConditionExpression 的 dynamodb 查询问题

node.js - TSLint:在拥有模型含义之外调用 Backbone get()

c - 当我只想接收单个连接时,应该如何在 C 中实现非阻塞服务器行为?

node.js - 套接字,从服务器向服务器发出事件

java - HTTP 和套接字 :

javascript - 如何为文本字段中的每个字母赋予不同的颜色?

javascript - 无需本地文件直接从浏览器上传字符串到s3