Skip to content
New issue

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

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

Already on GitHub? Sign in 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.

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

No branches or pull requests

1 participant