【问题标题】:nodejs Websocket Server - possible EventEmitter memory leak detectednodejs Websocket服务器 - 检测到可能的EventEmitter内存泄漏
【发布时间】:2016-06-26 16:49:26
【问题描述】:

我对节点比较陌生,我正在努力寻找答案!

我创建了一个非常基本的节点脚本,用于连接到 rs232 串行设备,同时它用作 websocket 服务器,以便客户端可以连接到它以从 rs232 设备获取实时输出,但我在 11 个客户端连接后,不断收到事件发射器最大侦听器错误。

如果有人可以在这里帮助我,或者如果我以错误的方式处理代码,请提供一些建议。

谢谢 杰米

这是代码

var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var WebSocketServer = require("ws").Server;

var serialPort = new SerialPort("COM5", {
  baudrate: 9600,
  parser: serialport.parsers.readline("\n")
});

var wss = new WebSocketServer({ port: 3000 });

serialPort.on("open", function () {

  console.log('open');

    var weight = 0;

    wss.on("connection", function(ws) {

        serialPort.on('data', function(data) {

            weight = data.toString();

            wss.clients.forEach(function(wssclient) {
                wssclient.send(weight);
            });

        });

    });

});

【问题讨论】:

  • 你的大部分代码总是加倍空格吗?

标签: node.js websocket eventemitter


【解决方案1】:

如果您的连接处理程序,您添加一个新的事件处理程序serialPort.on('data', ...)。因此,对于每个新传入的 websocket 连接,您为serialPort 添加一个新的事件处理程序。而且,您也永远不会删除它们。所以,它们只是永远积累,它们也都做同样的事情。

您看到的警告是因为 eventEmitter 对象看到所有事件处理程序都针对同一条消息的累积,并怀疑可能有问题。

相反,您可以将其移出连接处理程序,并在一个事件处理程序中完成所有处理:

serialPort.on('data', function(data) {
    var weight = data.toString();
    wss.clients.forEach(function(wssclient) {
        wssclient.send(weight);
    });
});

serialPort.on("open", function () {
    console.log('open');
    wss.on("connection", function(ws) {
        // code here that needs to happen upon connection
    });
});

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多