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 发送消息时发生内存泄漏