Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

TypeError: Object has no method packet #1747

Closed
nicholasrq opened this issue Aug 23, 2014 · 1 comment
Closed

TypeError: Object has no method packet #1747

nicholasrq opened this issue Aug 23, 2014 · 1 comment

Comments

@nicholasrq
Copy link

Hello. Faced with problem with global emitting events.
That's the 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 on http://socket.io.

UPD:

One more stack-trace with Socket.IO debug out:

  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)
@nicholasrq
Copy link
Author

Problem solved. It was modified prototype of Object. I think it's really good practice to use hasOwnProperty in for ... in loops like this one:

It's part of socket.io-adapter/index.js

      for (var id in self.sids) {
        if (~except.indexOf(id)) continue;
        socket = self.nsp.connected[id];
        if (socket) socket.packet(encodedPackets, true, flags.volatile);
      }

Otherwise somebody like me may have problems with such code when using libraries like Sugar.js.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant