@matveyvarg

Почему блок кода срабатывает несколько раз?

app.get('/watch/:id',function(req,res){
	roomid = req.params.id;
	Rooms.find({"id":roomid},function(err,rooms){
		if(err !== null)console.log(err);
		//res.send(rooms);
		res.render('index',{title:'Hello'});
		console.log(rooms);
	});
	io.on('connection',function(socket){
		console.log('socket '+socket.id.toString()+' was connected');	
		socket.on('join',function(r_id){
			console.log('type of roomid '+typeof(roomid));
			console.log('type of r_id '+typeof(r_id));
			console.log('r_id='+r_id+'\n');
			console.log('roomid='+roomid);
			socket.join(r_id);
			var clients_in_the_room = io.sockets.adapter.rooms[r_id]; 
			for (var clientId in clients_in_the_room ) {
  				console.log('client: %s', clientId); //Seeing is believing 
			}
		});
	//	socket.join(roomid);
		
		socket.on('message',function(msg,room_id){
			console.log('messg in '+room_id+' room\n'+'room_id type is ' + typeof(room_id));
			var rid = room_id.toString();
			io.to(room_id).emit('message_server',msg);
		});
		socket.on('message_server',function(msg){
			console.log('message_server '+msg);
		});
	});
	
	//res.sendfile('room.html')
});

При первом редиректе на '/watch/:id' все нормально, но когда в следующий раз меня редиректит на '/watch/:id ( при условии что предыдущее соединение было не закрыто) код, который идет после io.on('connection',function(socket){ начинает дублироваться, и сообщения выводятся по 2, 3 и т.д раз. Как сделать чтобы сообщение выводилось только 1 раз ?
  • Вопрос задан
  • 332 просмотра
Пригласить эксперта
Ответы на вопрос 3
@3luyka
Т.к. при каждом "app.get(...)" вы вешаете событие на io.on('connection')...
При первом запросе, Вы повесили 1 раз это бытие, затем 2-ой и т.д.
Ответ написан
Комментировать
Sivkoff
@Sivkoff
Web Developer
Вынесите этот код
io.on('connection',function(socket){
...
});

за пределы обработчика /watch/:id, он обрабатывается при коннекте сокета и весить на GET-запрос его ни к чему.
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы