【发布时间】: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