我正在开发一个聊天应用,并且连接正在重复。
在我的路线中,我有:
exports.index = function (io) {
return function (req, res) {
var userId;
res.render('index', {
title: 'RandomChat.me',
test: 'test2'
});
io.sockets.on('connection', function (socket) {
userId = socket.id;
console.log("+++++++++++++++++++" + userId);
socket.emit('addUser', { userId: userId });
socket.room = 'General';
socket.join(socket.room);
socket.on('sendMessage', function (data) {
console.log(data.room);
// socket.broadcast.emit('receiveMessage', { data: data });
socket.broadcast.to(data.room).emit('receiveMessage', { message: data.message });
});
});
}
};
客户端之类的东西:
var socket = io.connect('http://domain.com:3000');
var userId;
socket.on('addUser', function(data) {
userId = data.userId;
console.log(userId);
});
socket.on('receiveMessage', function (data) {
console.log(data);
});
var room: "General";
var message: "Test";
socket.emit('sendMessage', { room : room, message: message });
console.log(userId + " " + message)
如果我去应用程序并检查控制台日志,我会看到userId,当我重新加载页面时,我看到相同的ID两次,如果我再次重新加载,我会看到它3次,依此类推。
在node.js控制台中也发生了同样的事情。
所以基本上当连接/用户重复时,其他用户会收到重复的消息,因为sendMessage / receiveMessages函数不止一次运行。
帮助表示赞赏。
答案 0 :(得分:0)
使用io.sockets.once('connection', function (data){})
代替io.sockets.on('connection', function (data){})
修复它。它不会尝试恢复丢失的连接。
答案 1 :(得分:0)
问题在于这一行
io.sockets.on('connection', function (socket) {
您不应将这些放在请求处理程序中,因为为每个请求添加socket的连接处理程序是错误的。尝试在请求处理程序之外执行这些操作,并使用io对象从请求处理程序向套接字发出/广播事件。