运行 带节点的小 While 循环和 Discord.js 导致致命错误
Running Small While Loop with Node and Discord.js Causes Fatal Error
所以我最近决定尝试创建一个 Discord 机器人。我现在只是一个初学者,所以我在为我的 discord 机器人创建一个命令时遇到了一些困难。我想创建一个命令,可以杀死任何以前的 运行ning 命令,例如 //say 或 //spam(这是我正在玩的一个有趣的机器人,所以它允许一些 "spammy" 诸如机器人不断回复自己的漏洞(即 //say //say //say //say 等导致机器人 运行 //say 命令直到所有 //says已被执行。)
因此,我希望有一种方法可以在该命令与另一个命令失控时将其终止。我尝试了很多东西,但似乎没有任何效果。
这是我首先尝试的:
(注意:任务已定义,所以这不是问题,它只是在此代码块中不可见)
//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.');
}
});
然而,机器人完全忽略了这一点并继续 运行ning //say 命令,即使用户已尝试执行 //cease 命令。
之后我决定尝试使用 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.');
}
});
然而,这只会让命令提示符完全被 运行dom 东西吓坏了,我一点也不知道它是什么意思。我能理解的是进程 运行 内存不足...我想。
事情是这样的。
<--- 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 所解释的,setInterval()
间隔为 0 毫秒是一个更好的选择,但仍然要求很高。
因为 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);
所以我最近决定尝试创建一个 Discord 机器人。我现在只是一个初学者,所以我在为我的 discord 机器人创建一个命令时遇到了一些困难。我想创建一个命令,可以杀死任何以前的 运行ning 命令,例如 //say 或 //spam(这是我正在玩的一个有趣的机器人,所以它允许一些 "spammy" 诸如机器人不断回复自己的漏洞(即 //say //say //say //say 等导致机器人 运行 //say 命令直到所有 //says已被执行。)
因此,我希望有一种方法可以在该命令与另一个命令失控时将其终止。我尝试了很多东西,但似乎没有任何效果。
这是我首先尝试的: (注意:任务已定义,所以这不是问题,它只是在此代码块中不可见)
//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.');
}
});
然而,机器人完全忽略了这一点并继续 运行ning //say 命令,即使用户已尝试执行 //cease 命令。
之后我决定尝试使用 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.');
}
});
然而,这只会让命令提示符完全被 运行dom 东西吓坏了,我一点也不知道它是什么意思。我能理解的是进程 运行 内存不足...我想。
事情是这样的。
<--- 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 所解释的,setInterval()
间隔为 0 毫秒是一个更好的选择,但仍然要求很高。
因为 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);