当存储在变量中时,Socket.io 发射到 socket.id 不起作用

Posted

技术标签:

【中文标题】当存储在变量中时,Socket.io 发射到 socket.id 不起作用【英文标题】:Socket.io emitting to socket.id when stored in variable not working 【发布时间】:2021-08-14 17:53:56 【问题描述】:

如Sending message to a specific ID in Socket.IO 1.0 中给出的,可以通过使用发送到特定的客户端ID

io.to(socketid).emit('message', 'for your eyes only');

在我的 node.js 应用程序中,我正在尝试做同样的事情。基本上,当用户提交另一个 socket.id 时,node.js 后端会将给定的数据发送给该特定套接字 id。虽然前端将请求正确提交给后端,但当我尝试将数据发送到 id 时,它并没有通过。代码的“损坏”部分如下所示:

app.post('/send', function (req, res) 
    var post_body = req.body;

    var id = (JSON.stringify(post_body.id)).split('"')[1].split('"')[0];
    var payload = JSON.stringify(post_body.payload);
    var user = JSON.stringify(post_body.user);
    
    console.log(id); 
    console.log(payload);
    console.log(user);   

    io.to(id).emit('testerEvent',  description: 'A custom event named testerEvent!');

    res.status(200);

);

正在响应发布的数据(数据正确发布)。客户端监听事件“testerEvent”如下:

socket.on('testerEvent', function(data)document.write(data.description));

当仅使用 io.emit 而不是 io.to(id).emit 触发事件 testerEvent 时,它可以正常工作。 我将不胜感激,因为我刚刚开始学习 node 和 socket.io

【问题讨论】:

【参考方案1】:

io.to(id) 将向加入房间的客户发送消息,因此如果您尚未将任何客户加入房间,您将不会在客户端上收到消息。当您从 Socket.io 收到客户端套接字时,您可以尝试client.join(id) 来解决该问题。

【讨论】:

谢谢!有没有办法在不使用房间的情况下将它发送到某个 socket.client.id? 我检查了文档,它应该默认加入这个房间。您确定您传递的 ID 正确吗? id是通过myId = socket.io.engine.id从客户端获取的,然后通过post请求传给服务器。在另一个选项卡上,使用 io.to(生成和发送的 id).emit... 从服务器到第一个选项卡不会产生任何结果。 如果要向客户端发送消息,需要使用socket.id,而这个socket应该是客户端的socket。 socket.io/docs/v4/server-socket-instance 这里你可以看到一个例子。

以上是关于当存储在变量中时,Socket.io 发射到 socket.id 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在socket.io中发射到房间? [复制]

nodejs socket.io - 连接到服务器但发射不做任何事情

socket.io 发射在 socket.on 中不起作用

如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?

node.js socket.io 如何发射到特定的客户端?

在 NestJs 中使用 Socket IO 加入和发射到房间