【问题标题】:Websocket memory leak node.js. Event emitters?Websocket 内存泄漏 node.js。事件发射器?
【发布时间】: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 有什么方法,但如果它没有关闭,那么我不会在连接事件中使用它,否则你无法删除事件监听器,那就是你会发生内存泄漏。
  • 感谢您的帮助。

标签: javascript node.js express websocket


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-01-01
    相关资源
    最近更新 更多