Node.js 节点&;WebSocket、多个EventListener会导致MaxListenerSexceedawarning

Node.js 节点&;WebSocket、多个EventListener会导致MaxListenerSexceedawarning,node.js,websocket,event-listener,Node.js,Websocket,Event Listener,我有一个应用程序,它使用websocket连接在页面加载后向前端发送一些数据。我使用express的locals变量将websocket服务器传递给路由器 这是套接字设置: //certificate var key = fs.readFileSync('encryption/cert.key'); var cert = fs.readFileSync('encryption/cert.pem'); var options = { key: key, cert: cert, passphrase

我有一个应用程序,它使用websocket连接在页面加载后向前端发送一些数据。我使用express的locals变量将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) => { 
                // 
            });
        })

}
路由器设置:

//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) => { 
                // 
            });
        })

}
但是,这会导致在每次刷新新页面时添加多个EventListener

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
最终导致此错误:

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
那么,我的设置中缺少了什么?Thx


好的,我解决了。。。似乎我没有从概念上理解WebSocket

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

server.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;

请注意:Google App Engine(Node)标准不支持WebSocket,因此我选择了XMLHttpRequest: