노드를 배우려고했으며 socket.io로 매시업을 만들기 시작했습니다. 메시지 전송이 시작되었지만 몇 가지 문제가 있습니다.Socket.io 메시지 이벤트가 여러 번 발생합니다.
메시지 이벤트가 여러 번 발생하여받는 사람의 상자에 여러 번 나타나는 단일 메시지가 표시됩니다. 내가 exports.chat
소켓을 라우팅하고 그것이 문제를 일으키는 지 궁금해했다?
문제의 범위를 좁히려면 다음과 같이하십시오. 메시지는 클라이언트의 연결 순서 = 횟수를 실행합니다. 즉, 클라이언트가 두 번째로 연결하면 메시지가 두 번 발동합니다. 세 번 연결하는 클라이언트에 대해 세 번. 여기
는 코드입니다 :exports.chat = function(io, pseudoArray, req, res){
res.render('chat', {title: 'ChatPanel.'});
var users = 0;
io.sockets.on('connection', function (socket) { // First connection
users += 1;
// reloadUsers(io, users);
socket.on('message', function (data) { // Broadcast the message to all
if(pseudoSet(socket)) {
var transmit = {date : new Date().toISOString(), pseudo : returnPseudo(socket), message : data};
socket.broadcast.emit('message', transmit);
console.log("user "+ transmit['pseudo'] +" said \""+data+"\"");
}
});
socket.set('pseudo', req.session.user, function(){
pseudoArray.push(req.session.user);
socket.emit('pseudoStatus', 'ok');
console.log("user " + req.session.user + " connected");
});
socket.on('disconnect', function() { // Disconnection of the client
users -= 1;
// reloadUsers();
if (pseudoSet(socket)) {
var pseudo;
socket.get('pseudo', function(err, name) {
pseudo = name;
});
var index = pseudoArray.indexOf(pseudo);
pseudo.slice(index - 1, 1);
}
});
});
};
연결 해제 처리기에서 : pseudo.slice가있는 부분은 getter 핸들러 안에 있어야합니다. –