套接字.IO: TypeError: Object没有方法包

Socket.IO: TypeError: Object has no method packet

本文关键字:有方法 TypeError IO 套接字 Object      更新时间:2023-09-26

我在Socket.IO中遇到了全局发出事件的问题。这是一个服务器端错误,而不是#489。

出现错误的情况

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');

在所有情况下,我都有以下错误:

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)

发生错误的实际代码(从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;
}

解决方案吗?还是我做错了?顺便说一下,官方文档中列出了其中两种情况

在GitHub上也有一个问题:#1747

乌利希期刊指南:

一个堆栈跟踪:

  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)

你能试着用setInterval来解决这个问题吗?这可能是因为上下文不同。

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

你正在使用一个对象(类?)来存储你的方法,所以它可能在不好的上下文中

谢谢大家。问题解决了,这是由我的应用程序和修改的Object原型引起的:

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