узел и веб-сокеты, несколько eventListeners приводит к MaxListenersExceededWarning - PullRequest
0 голосов
/ 26 июня 2018

У меня есть приложение, которое использует подключение через веб-сокет для отправки некоторых данных во внешний интерфейс после загрузки страницы. Я использую переменную locals 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) => { 
                // 
            });
        })

}

Однако это приводит к тому, что при каждом обновлении новой страницы добавляется несколько 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

Так чего не хватает в моей настройке? Thx,

1 Ответ

0 голосов
/ 27 июня 2018

Хорошо, я решил это ... кажется, я концептуально не понимал websockets.

В роутере я удалил весь код, связанный с 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...