-1

所以我也尝试使用在另一个文件的函数中声明的变量。这是我声明变量的地方:

client.on('message', (message) => {
    var GuildId = message.guild.id;
});

我也想在另一个文件中使用“GuildId”。我尝试导出它:

module.exports = {
        GuildId
    }

然后导入它:

const { GuildId } =require("../main.js")

但是在我要导入的文件中,变量是未定义的……我完全不知道为什么会这样……

哦,是的..我还尝试使用以下命令导出它:

exports.GuildId = message.guild.id;

和:

GuildID = message.guild.id;

但它也没有奏效。有任何想法吗?:C

编辑:

这是一个 Discord Bot,它作为 MemberCount 函数,所以它创建了一个 Channel,显示 Discord 上有多少用户。所以我想使用 GuildId 从我的 MYSQL 数据库中获取这个可定制的频道 ID。为此,我需要拥有 GuildID。我这样做:

connection.promise().query( GuildId,
        `SELECT memberCountId FROM GuildConfigurable WHERE guildId = '${GuidId}'`
    ).then(result => {
        MemberCountChannel.set(GuidId, result[0][0].memberCountId);
        MemberCountChannelId = MemberCountChannel.get(GuidId);

我无法使用“guild.id”获取公会 ID,因为我太愚蠢了,而且它不起作用。我的意思是:

 connection.promise().query( GuildId,
        `SELECT memberCountId FROM GuildConfigurable WHERE guildId = '${guild.id}'`
    ).then(result => {
        MemberCountChannel.set(guild.id, result[0][0].memberCountId);
        MemberCountChannelId = MemberCountChannel.get(guild.id);

编辑2:

这是我的完整成员-counter.js:

常量 { 连接 } = 要求(“../database/db”);

module.exports = async (client) =>{
    
    setInterval(() => {
        
    let ts = Date.now();
    let date_ob = new Date(ts);
    let date = date_ob.getDate();
    let month = (date_ob.getMonth()+1);
    let year = date_ob.getFullYear();
    let hours = ('0' + (date_ob.getHours()+1)).slice(-2);
    let minutes = ('0' + (date_ob.getMinutes()+1)).slice(-2);
    let seconds = ('0' + (date_ob.getSeconds()+1)).slice(-2);

    const { globals } = require("../main.js");
    
    const GuildId = globals.GuildId;

        console.log('GuildId: ' + GuidId);

    let MemberCountChannel = new Map();
    module.exports.getMemberCount = (guildId) => {

    connection.promise().query( GuildId,
        `SELECT memberCountId FROM GuildConfigurable WHERE guildId = '${GuidId}'`
    ).then(result => {
        MemberCountChannel.set(GuidId, result[0][0].memberCountId);
        MemberCountChannelId = MemberCountChannel.get(GuidId);

    const guild = client.guilds.cache.get(GuidId);
        const memberCount = guild.memberCount;
        const channel = guild.channels.cache.get(MemberCountChannelId);
        console.log(MemberCountChannelId)
        channel.setName(`Mitglieder: ${memberCount.toLocaleString()}`);
        console.log('[INFO] '.green + year + '/' + month + '/' + date + ' ' + hours + ':' + minutes + ':' + seconds + ' Updating Member Count...');
    }).catch(err => console.log(err));

    };
    }, 15000);
}
4

2 回答 2

1

由于消息是异步的,因此您不能在其他地方同步使用它。我认为在这里,而不是导入 GuildId 的其他文件,让您的文件将成员计数文件作为函数导入,因此您可以在消息出现时在需要时检索成员计数:

// getMemberCount.js
module.exports.getMemberCount = (guildId) => {
  return connection.promise().query( GuildId,
        `SELECT memberCountId FROM GuildConfigurable WHERE guildId = '${GuidId}'`
    ).then(result => {
        MemberCountChannel.set(GuidId, result[0][0].memberCountId);
        MemberCountChannelId = MemberCountChannel.get(GuidId);
        // do other stuff with MemberCountChannelId
   });
};
// main.js
const { getMemberCount } = require('./getMemberCount');
client.on('message', (message) => {
    getMemberCount(message.guild.id)
     .catch(handleErrors); // don't forget this, don't want unhandled rejections
});
于 2021-03-09T02:35:04.883 回答
0

您已经在实施正确的解决方案来跨模块共享变量。但是,问题是您的变量正在存储一个值 - 在这种情况下,我假设一个字符串或数字。在这种情况下,每个模块都将获得该值的副本。

您需要的是导出指针/引用。为此,您需要导出一个对象或数组。在这种情况下,最好的解决方案是导出一个对象:

另一个问题是你在回调中声明(var)你想要的变量。这使得回调范围之外的代码无法访问。您需要在与您的共享范围内声明它module.exports

var globals = {}

client.on('message', (message) => {
    globals.GuildId = message.guild.id;
});

module.exports.globals = globals;

现在您可以导入它:

const { globals } =require("../main.js");
const GuildId = globals.GuildId;
于 2021-03-09T02:33:27.943 回答