简体   繁体   English

Socket.IO:TypeError:对象没有方法包

[英]Socket.IO: TypeError: Object has no method packet

I faced with problem with global emitting events with Socket.IO. 我遇到了Socket.IO的全局发射事件的问题。 That's a server-side error btw instead of #489 . 这是服务器端错误,而不是#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): 发生错误的实际代码(它是从CoffeeScript编译的,为便于阅读,抱歉):

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 GitHub上也有一个问题: #1747

UPD: 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? 您可以尝试使用setInterval查看此问题吗? It may be because of different context. 可能是因为上下文不同。

https://github.com/Automattic/socket.io/issues/489 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 : 问题解决了,被我的应用程序和modyfied原型造成的Object

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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