Socket.io: Socket.io lançou err:fn.bind não é uma função

Criado em 4 fev. 2016  ·  18Comentários  ·  Fonte: socketio/socket.io

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

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!

Todos 18 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações