得到以下错误:
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;
答案 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
)设置为undefined
或null
对象。
错误显示堆栈跟踪,表明特定的代码行来自文件/home/gibigbig/animesoul/app/node_modules/engine.io/node_modules/ws/lib/websocket.js
。 node_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
这帮助我找到了问题的根源。我不再对此错误有任何疑问。分享拯救生命。