在子进程之间共享一个模块导入

问题描述

当我尝试使用discord.js在discord机器人上进行分片时出现此问题。每个分片(至少在process模式下)都有自己的程序执行,这意味着不同的分片实际上是独立的机器人。我的机器人功能之一是要求用户在服务器和DM中使用命令。问题在于,所有DM都发送到单个分片,因此来自不同分片上服务器的任何用户的命令似乎都已损坏,因为尽管服务器的分片可以正确跟踪所有内容,但DM的分片仍在跟踪不同的服务器集,看不到任何数据。

我对分片还很陌生,我认为解决此问题的最佳方法是处理我在导入到index.js的模块中跟踪的所有信息,然后将必要的部分导入每个bot.js子进程分片,因此所有数据都合并到一个位置,并且每个分片都可以访问它。但是,无论如何设置,当我尝试将信息从index.js(分片管理器)导入bot.js(在每个分片上运行的bot的代码)时,我都会不断收到奇怪的承诺拒绝,没有堆栈跟踪)。

这一定是对子进程和父进程之间导入的某种限制,但是我还没有找到任何关于此的信息。有谁知道如何使导入在这里正常工作,或者有其他方法可以集中处理信息,以便每个分片都可以访问它?

解决方法

这就是我最初在做的事情,它为每个子进程提供了自己的信息集。我想我不是很清楚这个问题,但这是实时创建的信息和数据,因此每个进程将拥有完全不同的数据集,因为它们处理的是不同的服务器。我需要的是一种在所有子进程中保持跟踪的方式,以便它们都可以访问相同的信息,并且可以全部操纵所述信息。

然后您要使用client.shard.broadcastEval()。您可以使用以下方法从所有客户端缓存中获取公会属性:

const getServer = async (guildID) => {
    // try to get guild from all the shards
    const req = await client.shard.broadcastEval(`this.guilds.cache.get("${guildID}")`);

    // return Guild or null if not found
    return req.find(res => !!res) || null;
}

Example by ZiNc#2032
在以下链接中了解有关分片的更多信息: