1

我有一个不和谐的机器人,它刚刚达到 2500 台服务器,它停止登录,因为显然有 2500 台的限制,然后你需要使用分片,直到现在我才听说过。

所以我根据教程向我的机器人添加了一个 ShardManager:

const { ShardingManager } = require('discord.js');
const settings = require('./settings.json');

const manager = new ShardingManager('./bot.js', { token: settings.token });

manager.spawn();
manager.on('launch', shard => console.log(`Launched shard ${shard.id}`));

现在我用那个文件启动了机器人,我认为它一切正常,但后来机器人又退出了,我收到了一封来自 discord 的电子邮件,说他们会重置令牌,因为它在 24 年登录了大约 1000 次小时。

我尝试再次启动机器人并观察输出(因为我的永远节点 js 的错误日志似乎没有工作),我得到了错误:

(node:2465) UnhandledPromiseRejectionWarning: Error: Shard 1's Client took too long to become ready.
    at Timeout.setTimeout [as _onTimeout] (/var/discord-WriterBot/node_modules/d                                                                                                iscord.js/src/sharding/Shard.js:89:31)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)
(node:2465) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch                                                                                                 block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

然后对分片 2 进行同样的操作。

我对 ShardManager 做错了吗?我不太了解它,但我相信我正确地遵循了说明。

如果有帮助,这是完整的机器人代码:https ://github.com/cwarwicker/discord-WriterBot

谢谢。

4

1 回答 1

0

SHARDING_READY_DIED我在很长一段时间内一直在解决这个错误以及错误。为了捕获错误,您必须在分片创建过程中添加错误事件侦听器。

manager.on('shardCreate', async (shard) => {
  console.log('Shard Launched')
  shard.on('error', (error) => {
     console.error(error)
  })
})

如果在分片管理器上将 respawn 设置为 true,则分片将自动重启,并且父进程不会崩溃。

于 2021-07-01T08:46:55.237 回答