gpt4 book ai didi

javascript - 使用 Node 和 Discord.js 运行小 While 循环会导致 fatal error

转载 作者:行者123 更新时间:2023-12-02 23:40:26 25 4
gpt4 key购买 nike

所以我最近决定尝试创建一个 Discord 机器人。我目前只是一名初学者,所以在为我的不和谐机器人创建一个命令时遇到了一些困难。我想创建一个可以杀死任何以前运行的命令的命令,例如//say 或//spam (这是我正在使用的一个有趣的机器人,因此它允许一些“垃圾邮件”漏洞利用,例如机器人不断地回复自己(即//say//say//say//say 等,导致机器人运行//say 命令,直到所有//say 都被执行。)

因此,我希望有一种方法可以在命令与另一个命令失控时终止该命令。我尝试了很多东西,但似乎没有任何效果。

这是我首先尝试的:(注意:任务已定义,所以这不是问题,它只是在此代码块中不可见)

//stuff up to this point works fine
if (msg.content.startsWith(`${prefix}say`)) {
task = 1;
var text = msg.content.split(' ').slice(1).join(' ');
if(!text) return msg.reply('hello?');
if (task === 1) {
msg.channel.send(text);
} else if (task === 0) {
return;
}
if (msg.content.startsWith(`${prefix}cease`)) {
task = 0;
msg.channel.send('Task terminated successfully.');
}
});

但是,即使用户尝试执行//cease 命令,机器人也会完全忽略这一点并继续运行//say 命令。

之后我决定尝试使用 while 循环,如下所示:

//stuff up to this point work fine
if (msg.content.startsWith(`${prefix}say`)) {
task = 1;
var text = msg.content.split(' ').slice(1).join(' ');
if(!text) return msg.reply('hello?');
while (task === 1) {
msg.channel.send(text);
}
}
if (msg.content.startsWith(`${prefix}cease`)) {
task = 0;
msg.channel.send('Task terminated successfully.');
}
});

然而,这只会让命令提示符完全被随机的东西吓坏,我对它的含义没有丝毫线索。我所能理解的是,该进程内存不足......我认为。

这就是发生的事情。

<--- Last few GCs --->

[18668:000002D05FC41820] 31983 ms: Mark-sweep 1397.8 (1425.2) -> 1397.3 (1424.7) MB, 892.1 / 0.0 ms (average mu = 0.089, current mu = 0.015) allocation failure scavenge might not succeed
[18668:000002D05FC41820] 31990 ms: Scavenge 1398.1 (1424.7) -> 1397.6 (1425.2) MB, 5.5 / 0.0 ms (average mu = 0.089, current mu = 0.015) allocation failure


<--- JS stacktrace --->

==== JS stack trace =========================================

0: ExitFrame [pc: 000003DFF175C5C1]
1: StubFrame [pc: 000003DFF175D9BF]
Security context: 0x00069561e6e9 <JSObject>
2: Channel [00000127FFD14059] [C:\Users\[removed]\Documents\epic-bot\node_modules\discord.js\src\util\Constants.js:~165] [pc=000003DFF1A16AA6](this=0x0127ffd12799 <Object map = 0000023F67AEB559>,channelID=0x0199da820629 <Channel map = 000001B00E5314E1>)
3: /* anonymous */(aka /* anonymous */) [000000DACB142C...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 00007FF6F1A9F04A v8::internal::GCIdleTimeHandler::GCIdleTimeHandler+5114
2: 00007FF6F1A7A0C6 node::MakeCallback+4518
3: 00007FF6F1A7AA30 node_module_register+2032
4: 00007FF6F1D020EE v8::internal::FatalProcessOutOfMemory+846
5: 00007FF6F1D0201F v8::internal::FatalProcessOutOfMemory+639
6: 00007FF6F2222BC4 v8::internal::Heap::MaxHeapGrowingFactor+9556
7: 00007FF6F2219C46 v8::internal::ScavengeJob::operator=+24310
8: 00007FF6F221829C v8::internal::ScavengeJob::operator=+17740
9: 00007FF6F2220F87 v8::internal::Heap::MaxHeapGrowingFactor+2327
10: 00007FF6F2221006 v8::internal::Heap::MaxHeapGrowingFactor+2454
11: 00007FF6F1DDCDB7 v8::internal::Factory::NewFillerObject+55
12: 00007FF6F1E72CC6 v8::internal::WasmJs::Install+29414
13: 000003DFF175C5C1

答案可能是非常基本的,但正如我所说,我才刚刚开始。

如有任何帮助,我们将不胜感激。

谢谢!

最佳答案

免责声明:您当前的使用将被视为 API 滥用。此答案仅供学习之用,并不打算实现。

您的错误是正确的;您的 while 循环会导致崩溃,因为您的 CPU 耗尽了可用内存。它会无限地持续下去,并使用所有可用的资源。正如所解释的here ,间隔为 0 毫秒的 setInterval() 是一个更好的选择,但仍然要求较高。

由于 Discord 设有速率限制,因此如果您的机器人尝试在 5 秒的时间内发送超过 5 条消息,它就会停止发送消息。因此,你可以做这样的事情......

const args = message.content.trim().split(/ +/g);

/* say command */
const text = args.slice(1).join(' ');
if (!text) return;

const interval = setInterval(function() {
message.channel.send(text)
.catch(err => {
console.error(err);
clearInterval(interval);
});
}, 1000);

task = interval;


/* cease command */
clearInterval(task);

关于javascript - 使用 Node 和 Discord.js 运行小 While 循环会导致 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56104579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com