node&websockets,多个事件监听器导致MaxListenersExceededWarning。



我有一个应用程序,它使用 websocket 连接在加载页面后将一些数据发送到前端。我使用 express 的局部变量将 websocket 服务器传递给路由器。

这是套接字设置:

//certificate
var key = fs.readFileSync('encryption/cert.key');
var cert = fs.readFileSync('encryption/cert.pem');
var options = { key: key, cert: cert, passphrase: 'kevinius', requestCert: false, rejectUnauthorized: false };
//create server
const server = https.createServer(options, app).listen(process.env.PORT || 8080, (err)=>{
console.log(`Listening on: https://localhost:${process.env.PORT}`)
});
// websocket
let wss = new WebSocket({ server });
app.locals.socket = wss;

路由器设置:

router.get('/', function (req, res, next) {
var socket = req.app.locals.socket;
console.log('yesssssss')
socket.on('connection', (ws) => {
//this keeps on adding new eventListeners resulting in MaxListenersExceededWarning
console.log('connection');
ws.send(JSON.stringify(['cover', htmlTemplate]), (err) => { 
// 
});
})
}

但是,这会导致在每次新页面刷新时添加多个事件侦听器

yesssssss
connection
yesssssss
connection
connection
yesssssss
connection
connection
connection

最终导致此错误:

(node:15515) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message listeners added. Use emitter.setMaxListeners() to increase limit

那么我的设置中缺少什么?感谢

好的,我解决了...似乎我在概念上不了解 Websockets。

在路由器中,我删除了所有与 websocket 相关的代码,并创建了一个仅在服务器启动时调用一次的模块。

服务器.js

const sockLib = require('./library/ws.js');
sockLib.setConnection(server);

图书馆/WS.js

const WebSocket = require('ws').Server;
var wss;
var socket;
function setConnection(server) {
wss = new WebSocket({ server });
wss.on('connection', (ws) => {
socket = ws;
socket.on('message', function (message) {
let mss = JSON.parse(message);
if (mss[0] == 'home/covers') {
callYourOtherCode(mss[1]);
}
});
})
}
module.exports.setConnection = setConnection;

最新更新