Node.js socket.io不向会议室中的其他人发送事件
所以我试图弄清楚一个非常基本的socket.io应用程序到底发生了什么。我用两个不同的标签来测试这一点,它们注册为不同的用户,并尝试查看另一个是否获得事件。两个前端都没有接收到其他事件,但服务器确实正确地接收到了事件。我的前端是vue.js,我想我的代理设置是正确的。我不确定为什么连到同一个房间的两个人不能收到基于文档的事件 编辑:如果我删除roomId的.to,则消息将仅复制到发送消息的用户:/n不确定这是否意味着什么 Edit2:这与rabbitmq适配器不用于中继消息有关。通过移除中间件,一切都能正常工作 Node.js服务器Node.js socket.io不向会议室中的其他人发送事件,node.js,vue.js,socket.io,Node.js,Vue.js,Socket.io,所以我试图弄清楚一个非常基本的socket.io应用程序到底发生了什么。我用两个不同的标签来测试这一点,它们注册为不同的用户,并尝试查看另一个是否获得事件。两个前端都没有接收到其他事件,但服务器确实正确地接收到了事件。我的前端是vue.js,我想我的代理设置是正确的。我不确定为什么连到同一个房间的两个人不能收到基于文档的事件 编辑:如果我删除roomId的.to,则消息将仅复制到发送消息的用户:/n不确定这是否意味着什么 Edit2:这与rabbitmq适配器不用于中继消息有关。通过移除中间件,
import http from 'http';
import express from 'express';
import { Server } from 'socket.io';
const adapter = require('socket.io-amqp');
const app = express();
const server = http.createServer(app);
const io = new Server(server,{
path: '/socket'
});
io.adapter(adapter('amqp://localhost'));
app.get('/',(req,res) => {
res.send('<h1>Hello World, Again</h1>')
});
io.on('connection',(socket) => {
const query = socket.handshake.query;
const userId = query['userId'] as string;
const roomId = query['roomId'] as string;
if(!userId || !roomId)
{
console.log('failed to connect - userId or roomId is undefined');
socket.disconnect();
return;
}
socket.join(roomId);
console.log(`connection - user: ${userId}, room: ${roomId}`);
socket.on('newValue',(e) => {
socket.to(roomId).emit('newValue',{
userId: userId,
value: e.value
});
console.log(`roomId: ${roomId}, userId: ${userId}, value: ${e.value}`);
});
socket.on('disconnect',(reason)=> {
socket.to(roomId).emit('userDisconnect',{
userId: userId
});
console.log(`disconnect - user: ${userId}, room: ${roomId}`);
});
socket.to(roomId).emit('newUser',{
userId
});
});
const PORT = 3000;
server.listen(PORT,() => {
console.log(`listening on http://localhost:${PORT}`);
});
服务器日志
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
listening on http://localhost:3000
connection - user: ls91m4il, room: 123, socketId: 86zN3g6maJu1z0OzAAAB
connection - user: pq68znqa, room: 123, socketId: xvKKzXhEbCrnz_l_AAAD
roomId: 123, userId: ls91m4il, socketId, 86zN3g6maJu1z0OzAAAB value: 5
roomId: 123, userId: pq68znqa, socketId, xvKKzXhEbCrnz_l_AAAD value: 13
onAny或具有匹配命名事件的订阅的事件响应不会触发前端日志。首先,socket.to(roomId).emit(…)
将向roomId中的每个套接字发送消息,由socket
表示的客户端除外。如果要发送到roomId
中的所有套接字,可以使用io.to(roomId).emit(…)
。我不清楚您是想发送到所有套接字还是发送到所有套接字,除了发起者,所以我想确保您了解这方面的内容
通过调试和日志记录,您可以了解到一些问题:
connect
和disconnect
事件上记录实际的socket.id
,可以很好地了解这一点
roomId
。如果每个房间的roomId
不同,则roomId
中只有一个套接字,并且socket.to().emit()
将没有其他人可以发送
newValue
消息的客户端没有发布表单,该表单会导致页面重新加载,从而断开旧套接字并创建新套接字。登录点#1应确保您不会看到这种情况发生。我之所以提到这一点,主要是因为这是一个常见的错误,尽管我没有看到足够多的实际HTML页面来了解这是否会成为您的问题
socket.id
。这将允许您重构整个消息流
如果没有所有这些数据,我们就没有能力找出问题所在。这类问题需要收集数据,然后跟踪线索,直到您能够更准确地看到发生了什么和没有发生什么。如果我不得不冒险猜测,我想知道您是否对#1或#2有问题。摆脱vue内容如果您的问题不是接收消息,那就不相关了。输入一些日志,找出发生了什么和没有发生什么。查看网络选项卡以查看是否收到消息。我的意思是vue.js正在使用代理。。。我不知道这是否相关。代码中有很多日志。消息到达服务器,然后客户端没有收到来自服务器的任何消息。。。我觉得这篇评论是在没有真正注意到我所说的内容的情况下发表的……文章越长,阅读和理解你的实际问题就越困难。在这种情况下,听起来您没有正确使用socket.io api。在这种情况下,第一步是消除所有其他因素,并集中精力使其发挥作用。然后你就可以读vue的东西了。在路上,你可能会发现你的实际问题是什么,并且能够提出一个问题,而不仅仅是“为什么我的代码不能工作?”我记录了除socketId之外的所有东西,我添加了它,但仍然看到了同样的事情。并没有重新连接,消息向下发出newValue,并没有一个客户端得到它。socket.io不能与开发机器上的多个浏览器选项卡一起工作吗?@ChaseRLewis-如果您希望我们能够进一步帮助您,我们需要查看您所说的添加的所有日志。请将代码(包括所有新的
console.log()
语句)添加到您的问题中,并添加您在控制台中获得的结果日志。Socket.io可以与多个浏览器选项卡配合使用。@ChaseRLewis-我没有看到任何客户端代码专门侦听服务器在Socket.to().emit()中发送的newValue
消息。这当然可以解释为什么你没有收到它。你依赖于这个.socket.onAny(…)
吗?我依赖于any是因为newValue不起作用。我现在已经在代码中添加了这两个选项,两个选项都没有响应。我还添加了请求的服务器日志。未触发前端日志。服务器端代码显示服务器上的新值已触发。@ChaseRLewis-我不知道。当您在服务器上收到newValue
消息时,我会尝试将一些固定消息发送回客户端。例如,执行socket.emit('gotNewValue')
并查看您的客户机是否可以直接从服务器接收任何消息,甚至不涉及房间?为客户端中的gotNewValue
消息注册特定的侦听器。你需要简化,找到一些有用的东西,然后再重新构建。我对代理和自定义适配器所做的工作一点也不熟悉,所以这可能也会影响问题的解决。
module.exports = {
devServer: {
proxy: {
'/socket': {
target: 'http://localhost:3000',
changeOrigin: true,
ws: true,
}
}
}
}
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
listening on http://localhost:3000
connection - user: ls91m4il, room: 123, socketId: 86zN3g6maJu1z0OzAAAB
connection - user: pq68znqa, room: 123, socketId: xvKKzXhEbCrnz_l_AAAD
roomId: 123, userId: ls91m4il, socketId, 86zN3g6maJu1z0OzAAAB value: 5
roomId: 123, userId: pq68znqa, socketId, xvKKzXhEbCrnz_l_AAAD value: 13