英文:
Socket IO server restart causes duplicate client emits
问题
当我对我的Node/Socket IO服务器进行更改并重新启动时,连接的客户端会开始发送两条消息,而不是一条。如果我再次重新启动,它会开始发送三条消息,依此类推。
我唯一看到的“解决方法”是刷新客户端页面以强制建立新连接。
如何防止客户端在服务器重新启动后发送多个消息?
非常标准的设置:
服务器
const app = express();
const port = process.env.PORT || 4000;
const server = app.listen(port, () => console.log(`Server started on port ${port}`));
const io = require('socket.io').listen(server);
app.get('/', (req, res) => {
res.sendFile('/public/index.html', { root: __dirname });
});
io.on('connection', client => client.on('event', (msg) => console.log(msg)));
客户端
const socket = io.connect('', { query: { path: window.location.pathname }, reconnect: false, forceNew: true });
$("body").on("click", "a", () => socket.emit('event', 'test'));
请注意,上述代码是JavaScript代码,不需要翻译。
英文:
When I make changes to my Node/Socket IO server and restart it, the connected client will start emitting two messages for each one. If I restart again, it will start emitting three, and so forth.
The only "fix" I see is to refresh the page on client to force a new connection.
How do I prevent the client from emitting multiple messages after a server restart?
Pretty standard setup:
Server
const app = express();
const port = process.env.PORT || 4000;
const server = app.listen(port, () => l(`Server started on port ${port}`));
const io = require('socket.io').listen(server);
app.get('/', (req, res) => {
res.sendFile('/public/index.html', { root: __dirname });
});
io.on('connection', client => client.on('event', (msg) => console.log(msg));
Client
const socket = io.connect('', { query: { path: window.location.pathname }, reconnect: false, forceNew: true });
$("body").on("click", "a", () => socket.emit('event', 'test'));
答案1
得分: 2
这是解决方案:
https://github.com/socketio/socket.io/issues/430#issuecomment-451130988
不要将 socket.on 包装在像 connect 或 authenticated 这样的操作中。
在我的示例中,我将 "socket.on" 包装在授权中。一旦客户端重新连接,"socket.on" 会叠加并在服务器重新启动时每次都增加。
英文:
Here is the solution:
https://github.com/socketio/socket.io/issues/430#issuecomment-451130988
Don't wrap the socket.on in actions like connect or authenticated.
In my example I had a "socket.on" wrapped in authorization. As soon as the client reconnected the socket.on stacked up and multiplied each time the server restarted.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论