有人可以解释此错误的含义

时间:2019-05-23 15:32:40

标签: node.js socket.io

得到以下错误:

0|animesoul  |   websocket.readyState = WebSocket.CLOSING;
0|animesoul  |                        ^
0|animesoul  | TypeError: Cannot set property 'readyState' of undefined
0|animesoul  |     at Socket.socketOnClose (/home/gibigbig/animesoul/app/node_modules/engine.io/node_modules/ws/lib/websocket.js:781:24)
0|animesoul  |     at emitOne (events.js:121:20)
0|animesoul  |     at Socket.emit (events.js:211:7)
0|animesoul  |     at TCP._handle.close [as _onclose] (net.js:557:12)

不确定是什么文件或事件导致了此问题。我随机收到该错误,但它使我的节点进程崩溃。我什至不知道如何调试它,因为它并没有真正告诉我任何特殊用途。 Googling并没有真正提供太多见解,大约还有3个人有类似的问题,我怀疑这与重复的连接有关,但我想确认一下。

我在pm2中运行此应用程序的4个节点,并且正在使用nginx进行负载均衡

app.js

    express = require('express'),
    exphbs = require('express-handlebars'),
    client = require('./lib/discord.js'),
    site = require('./global.js'),
    serverio = require('http').createServer(app),
    io = require('./lib/io'),
    port = process.env.PORT ,
    redis = require('redis'),
    brooker = require('./broker')

let data = {};
var subscriber = redis.createClient([redacted]);
brooker();
subscriber.on("message", function (channel, message) {
    messages = JSON.parse(message);
    io.to(messages.room).emit(messages.event, messages)
});
client.on('ready', async () => {
    app.engine('handlebars', exphbs({ defaultLayout: 'main' }));
    app.set('view engine', 'handlebars');
    app.set('env production');
    app.use("*", function (req, res, next) {
        return res.status(404).render('404', { data: data, user: req.user, layout: "main" });
    });
    io.attach(serverio);
    serverio.listen(port, function () {
        console.log('listening on *:' + port);
    });

});
subscriber.subscribe("notifications");
process.on('SIGINT', async function () {
    process.exit();
});

/lib/io.js

const io = require('socket.io')();    
module.exports = io;

3 个答案:

答案 0 :(得分:2)

0|animesoul  |   websocket.readyState = WebSocket.CLOSING;
0|animesoul  |                        ^
0|animesoul  | TypeError: Cannot set property 'readyState' of undefined
0|animesoul  |     at Socket.socketOnClose (/home/gibigbig/animesoul/app/node_modules/engine.io/node_modules/ws/lib/websocket.js:781:24)
0|animesoul  |     at emitOne (events.js:121:20)
0|animesoul  |     at Socket.emit (events.js:211:7)
0|animesoul  |     at TCP._handle.close [as _onclose] (net.js:557:12)

要说明错误,而不是原因:

这是TypeError。也就是说,您无法将属性(readyState)设置为undefinednull对象。

错误显示堆栈跟踪,表明特定的代码行来自文件/home/gibigbig/animesoul/app/node_modules/engine.io/node_modules/ws/lib/websocket.jsnode_modules的存在表明它是节点模块,“ engine.io”使用的是“ ws”库,并且行是781。可能与this GitHub Issue的副本一样吗?

其余的痕迹有一点帮助,但无济于事。它从TCP关闭时的NodeJS(net库)开始,它发出一些内容(“ Socket.emit”),并由ws库“ Socket.socketOnClose”处理。最好可以告诉您此异常是在套接字关闭时发生的。

您还可以尝试向过程中添加unhandledException handler。您可能会以这种方式获得更多信息,或者确定错误是普通的,并且在记录后,只需忽略它即可! (通常这是一个坏主意,因为它将隐藏其他重要的错误)。

答案 1 :(得分:0)

我不知道此问题的原因,但是,我更改了此代码:

function receiverOnError(err) {
  const websocket = this[kWebSocket];
    websocket._socket.removeListener('data', socketOnData);
    websocket.readyState = WebSocket.CLOSING;
    websocket._closeCode = err[constants.kStatusCode];
    websocket.emit('error', err);
    websocket._socket.destroy();
  }

function receiverOnError(err) {
  const websocket = this[kWebSocket];

    websocket._socket.removeListener('data', socketOnData);
    if (websocket) {
        websocket.readyState = WebSocket.CLOSING;
    }
    websocket._closeCode = err[constants.kStatusCode];
    websocket.emit('error', err);
    websocket._socket.destroy();
  }
}

直到我弄清楚是什么原因造成的,这必须做。

答案 2 :(得分:0)

再次更新:

找到了一个名为“ Longjohn”的惊人包装 https://www.npmjs.com/package/longjohn

这帮助我找到了问题的根源。我不再对此错误有任何疑问。分享拯救生命。