Websocket 内存泄漏 node.js。事件发射器?

Posted

技术标签:

【中文标题】Websocket 内存泄漏 node.js。事件发射器?【英文标题】:Websocket memory leak node.js. Event emitters? 【发布时间】:2021-11-01 16:34:22 【问题描述】:

在使用我的代码 10 次之后,我得到了事件发射器泄漏。我了解事件发射器的默认设置会在控制台中自动发出警告。我的问题是这段代码中的什么直接创建了事件监听器?是我的编码不好,还是只是 websockets 是如何堆叠在一起的?

我会稍微解释一下代码。我在另一个中有一个 websocket,我认为它会将数据提供给一个基本上从 Twitch 流向 localhost 站点的网页。但是,如果我使用关键字超过 10 次,就会出现错误。我对 WebSockets 的了解还不够,无法真正理解为什么我的代码会在收到每个 msg.text 时创建一个新的侦听器,所以有更多了解的人请帮忙!

我相信我的问题类似于this,尽管我很难在这里概念化我自己的代码

const  paintballShot  = require('./javascript/paintballGunFire');
const  readPin  = require('./JavaScript/readPin');
const ws = require('ws');
const express = require('express');


const app = express();

//CONNECT TO TWITCH
let client = new ChatClient(
  connection: 
    type: "websocket",
    secure: true,
  
);

//connected?
client.on("ready", () => console.log("Successfully connected to chat"));
client.on("close", (error) => 
  if (error != null) 
    console.error("Client closed due to error", error);
  
);

//create headless websocket
const wsServer = new ws.Server( noServer: true );
wsServer.on('connection', function connection(socket) 

//call other websocket connected to Twitch from inside the new websocket
client.on("PRIVMSG", (msg, error) => 
  if (msg.messageText === "right") 
    socket.send(JSON.stringify(`$msg.displayName: $msg.messageText`));
  
  
  if (msg.messageText === "left") 
    socket.send(JSON.stringify(`$msg.displayName: $msg.messageText`));
  

  if (msg.messageText === "fire") 
    socket.send(JSON.stringify(`$msg.displayName: $msg.messageText`));
    paintballShot();
  

  if (msg.messageText === "pin") 
    readPin();
  
  process.on('uncaughtException', function (err) 
    console.log(err);
); 
);


client.connect();
client.join("channel");

  socket.on('message', message => console.log(message));
);

// `server` is a vanilla Node.js HTTP server
const server = app.listen(3000);
server.on('upgrade', (request, socket, head) => 
  wsServer.handleUpgrade(request, socket, head, socket => 
    wsServer.emit('connection', socket, request);
  );
);
process.on('uncaughtException', function (err) 
    console.log(err);
);

【问题讨论】:

每次你得到一个套接字连接时 -> client.on("PRIVMSG", 这些都是堆叠的,永远不会被删除,你也想在连接关闭时做client.off(。你里面也有process.on('uncaughtException',这是没有意义的。 client.off 不是我不认为的选项?这个想法是我想不断地倾听,然后每次使用一个词时触发事件。如果我关闭 websocket,我不能听吗?对不起process.on。我试图了解发生了什么。您认为将第二个 WebSocket 包装在 if 语句中以打开和关闭它可以工作吗?只是大声思考。 If I turn the websocket off 我不是要你关闭 websocket。另外我不知道ChatClient 有什么方法,但如果它没有关闭,那么我不会在连接事件中使用它,否则你无法删除事件监听器,那就是你会发生内存泄漏。 感谢您的帮助。 【参考方案1】:

总结一下,我正在使用的库 (Dank TwitchIRC) 确实有一个连接速率限制器,如果您一开始将它添加到您的聊天客户端,它似乎可以工作。如果我将它设置得足够低,取决于从 Twitch 收到的消息,它会以同样快的速度结束连接,这意味着不会发生内存泄漏。

【讨论】:

以上是关于Websocket 内存泄漏 node.js。事件发射器?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Socket.IO + Node.js + ZMQ 发送消息时发生内存泄漏

Electron App 中的事件发射器内存泄漏

Node.js内存泄漏分析

Node.js内存泄漏分析

检测代码中的 node.js/javascript 内存泄漏

使用 Node.js 服务器调试内存泄漏