por que isso acontece e como posso corrigi-lo? por favor me ajude~
erro de onde:
...\socket.io-adapter\index.js:195
if (fn) process.nextTick(fn.bind(null, null, sids));
versão do socket.io:
1.4.5
Recebi o mesmo erro ao tentar criar o aplicativo de bate-papo multiroom do livro "Node.js em ação"
<MY_PATH>\chatrooms\node_modules\socket.io-adapter\index.js:195
if (fn) process.nextTick(fn.bind(null, null, sids));
^
TypeError: fn.bind is not a function
at Adapter.clients (<MY_PATH>\chatrooms\node_modules\socket.io-adapter\index.js:195:31)
at Namespace.clients (<MY_PATH>\chatrooms\node_modules\socket.io\lib\namespace.js:253:16)
at joinRoom (<MY_PATH>\chatrooms\lib\chat_server.js:71:32)
at Namespace.<anonymous> (<MY_PATH>\chatrooms\lib\chat_server.js:20:5)
at emitOne (events.js:90:13)
at Namespace.emit (events.js:182:7)
at Namespace.emit (<MY_PATH>\chatrooms\node_modules\socket.io\lib\namespace.js:206:10)
at <MY_PATH>\chatrooms\node_modules\socket.io\lib\namespace.js:174:14
at _combinedTickCallback (node.js:370:9)
at process._tickCallback (node.js:401:11)
O problema aparece se você atualizar as dependências para as versões mais recentes:
"dependencies": {
"mime": "^1.3.4",
"socket.io": "^1.4.5"
}
enquanto funciona se você usar as dependências especificadas pelo livro
"dependencies": {
"socket.io": "~0.9.6",
"mime": "~1.2.7"
}
Aliás, antes de comentar aqui, li a página Migration from 0.9 do site socket.io mas não encontrei solução.
Posso fazer upload do projeto de chat simples em algum lugar, se necessário (é muito pequeno).
Verifiquei o exemplo no livro NodeJs em ação, e claro que não vai funcionar se você usar as versões mais recentes do socket.io, você terá as 2 linhas a seguir para fazer funcionar:
A partir de:
var usersInRoom = io.sockets.clients(room);
Para:
var usersInRoom = io.of('/').in(room).clients;
e de:
socket.emit('rooms', io.sockets.manager.rooms);
para:
socket.emit('rooms', io.of('/').adapter.rooms);
Saudações!
thnx @CheckMater
thnx @CheckMater
thnx @CheckMater
thnx @CheckMater
thnx @CheckMater
Obrigado cara @CheckMater
obrigado @CheckMater
obrigado @CheckMater
obrigado @CheckMater
obrigado @CheckMater
Obrigado @CheckMater . Mas para mim simplesmente mudar var usersInRoom = io.of('/').in(room).clients;
não funcionou. Como esses clientes são uma função que recebe um retorno de chamada como parâmetro, o trecho abaixo funcionou para mim.
io.of('/').in(room).clients(function(error,clients){
var otherUsers = [];
for(var i in clients){
if(socket.id != clients[i]) otherUsers.push(nickNames[clients[i]]);
}
var userSummary = 'Users Currently in ' + room + ' are : ' + otherUsers.join(', ') + '.';
socket.emit('message',{text:userSummary});
});
console.log(io.of('/').in(room).clients);
ReferenceError: as salas não estão definidas : em findClientsSocket
thnx @CheckMater
thnx @CheckMater
obrigado @CheckMater
obrigado @CheckMater
Comentários muito úteis
Verifiquei o exemplo no livro NodeJs em ação, e claro que não vai funcionar se você usar as versões mais recentes do socket.io, você terá as 2 linhas a seguir para fazer funcionar:
A partir de:
var usersInRoom = io.sockets.clients(room);
Para:
var usersInRoom = io.of('/').in(room).clients;
e de:
socket.emit('rooms', io.sockets.manager.rooms);
para:
socket.emit('rooms', io.of('/').adapter.rooms);
Saudações!