Я разрабатываю приложение для чата, и соединения дублируются.
На моем пути у меня есть:
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, и когда я перезагружаю страницу, я дважды вижу один и тот же идентификатор, если снова перезагружаюсь, я вижу его 3 раза и так далее.
То же самое происходит в консоли node.js.
Таким образом, в основном, когда соединения/пользователи дублируются, другие пользователи получают повторяющиеся сообщения, так как функции sendMessage/receiveMessages выполняются более одного раза.
Помогите оценить.
Проблема в этой строке
io.sockets.on('connection', function (socket) {
Вы не должны помещать их внутри обработчика запроса, потому что просто неправильно добавить обработчик соединения для сокета для каждого запроса. Попробуйте сделать это за пределами обработчика запросов и использовать io-объект для передачи/трансляции событий в сокеты из обработчика запросов.
Использование io.sockets.once('connection', function (data){})
вместо io.sockets.on('connection', function (data){})
исправлено. Он не пытается восстановить потерянное соединение.