简体   繁体   中英

Socket.IO: TypeError: Object has no method packet

I faced with problem with global emitting events with Socket.IO. That's a server-side error btw instead of #489 .

Cases when error occur

nsp = io.of('/namespace');
nsp.emit('hello', 'there');

io.emit('hello', 'there');

io.sockets.emit('hello', 'there');

var needed_namespace = '/my_namespace';
io.nsps[needed_namespace].emit('hello', 'there');

In every case i have the following error:

TypeError: Object function (key) {
    if (!this[key]) {
      return this[key] = 1;
    } else {
        return this[key] += 1;
    }
} has no method 'packet'
at /Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/index.js:125:28
at Encoder.encode (/Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/node_modules/socket.io-parser
at Adapter.broadcast (/Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/index.js:107:16)
at Namespace.emit (/Users/nr/Git/lt-connection/node_modules/socket.io/lib/namespace.js:218:18)
at SocketTransport.global.SocketTransport.SocketTransport.deliver (/Users/nr/Git/lt-connection/lib/prototype/socket.coffee:40:26)
at SocketTransport.global.SocketTransport.SocketTransport.emit (/Users/nr/Git/lt-connection/lib/prototype/socket.coffee:11:6)
at SocketTransport.global.SocketTransport.SocketTransport.send_from_http (/Users/nr/Git/lt-connection/lib/prototype/socket.
at Object.exports.routes.handlers.post (/Users/nr/Git/lt-connection/lib/http_server/routes/socket_router.coffee:9:11)
at apply (/Users/nr/Git/lt-connection/node_modules/director/lib/director/router.js:444:19)
at _every (/Users/nr/Git/lt-connection/node_modules/director/lib/director/router.js:28:9)
at [object Object].Router.invoke (/Users/nr/Git/lt-connection/node_modules/director/lib/director/router.js:450:5)
at parseAndInvoke (/Users/nr/Git/lt-connection/node_modules/director/lib/director/http/index.js:175:10)
at [object Object].Router.dispatch (/Users/nr/Git/lt-connection/node_modules/director/lib/director/http/index.js:198:7)
at /Users/nr/Git/lt-connection/lib/http_server/index.coffee:31:13
at IncomingForm.<anonymous> (/Users/nr/Git/lt-connection/node_modules/formidable/lib/incoming_form.js:104:9)
at IncomingForm.emit (events.js:92:17)
at IncomingForm._maybeEnd (/Users/nr/Git/lt-connection/node_modules/formidable/lib/incoming_form.js:551:8)
at QuerystringParser.parser.onEnd (/Users/nr/Git/lt-connection/node_modules/formidable/lib/incoming_form.js:446:10)
at QuerystringParser.end (/Users/nr/Git/lt-connection/node_modules/formidable/lib/querystring_parser.js:25:8)
at IncomingMessage.<anonymous> (/Users/nr/Git/lt-connection/node_modules/formidable/lib/incoming_form.js:129:30)
at IncomingMessage.emit (events.js:92:17)
at _stream_readable.js:938:16
at process._tickCallback (node.js:419:13)

Actual code where error occur (it compiled from CoffeeScript, sorry for readability):

deliver: function(message, channel, namespace, socket) {
    var err;
    socket = this.get_namespace(namespace, socket);
    message = this.prepage_message(message);
    try {
        if (channel != null) {
        //error occur here (line 125:28 from error stack)
        return socket.emit(channel, message);
    }
        //also error will be here when 'channel' not passed to '.deliver()'
        return socket.emit(message);
    } catch (_error) {
        err = _error;
        return console.warn('Something may be wrong: ' + err.stack);
    }
},

get_namespace: function(ns, socket) {
    var namespace, _ref;
    if (socket != null) {
        return socket;
    }
    namespace = null;
    if ((namespace = this.namespaces[ns]) != null) {
        return namespace;
    } else if ((namespace = (_ref = this.io.nsps) != null ? _ref[namespace] : void 0) != null) {
        return this.namespaces[ns] = namespace;
    } else {
        return this.create_namespace(ns);
    }
},

create_namespace: function(ns) {
    var socket;
    if (ns == null) {
        ns = '/';
    }
    socket = this.io;
    if (ns !== '/') {
        socket = socket.of(ns);
    }
    this.namespaces[ns] = socket;
    return socket;
}

Any solutions? Or may be i doing it wrong? Btw two of these cases are listed in official docs

Also there is an issue on GitHub: #1747

UPD:

One more stack-trace:

  socket.io-parser encoding packet {"type":2,"data":["hello","world"],"nsp":"/"} +0ms
  socket.io-parser encoded {"type":2,"data":["hello","world"],"nsp":"/"} as 2["hello","world"] +0ms

/Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/index.js:125
        if (socket) socket.packet(encodedPackets, true, flags.volatile);
                           ^
TypeError: Object function (key) {
    if (!this[key]) {
      return this[key] = 1;
    } else {
      return this[key] += 1;
    }
  } has no method 'packet'
  at /Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/index.js:125:28
  at Encoder.encode (/Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/node_modules/socket.io-parser/index.js:110:5)
  at Adapter.broadcast (/Users/nr/Git/lt-connection/node_modules/socket.io/node_modules/socket.io-adapter/index.js:107:16)
  at Namespace.emit (/Users/nr/Git/lt-connection/node_modules/socket.io/lib/namespace.js:218:18)
  at Server.(anonymous function) [as emit] (/Users/nr/Git/lt-connection/node_modules/socket.io/lib/index.js:338:16)
  at SocketTransport.global.SocketTransport.SocketTransport.deliver (/Users/nr/Git/lt-connection/lib/prototype/socket.coffee:40:15)
  at SocketTransport.global.SocketTransport.SocketTransport.emit (/Users/nr/Git/lt-connection/lib/prototype/socket.coffee:11:6)

Can you try to look at this problem with setInterval? It may be because of different context.

https://github.com/Automattic/socket.io/issues/489

You are using an object (class?) to store your methods, so it may be in bad context.

Thanks all. Problem solved and was caused by my app and modyfied prototype of Object :

global.Object.prototype.increment = function(key) {
    if(!this[key]){
        this[key] = 1;
    }else{
        this[key] += 1;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM