簡體   English   中英

節點JS | 不能在多個文件中使用變量

[英]Node JS | Can't use variable in multiple files

所以我也嘗試在另一個文件中使用在 function 中聲明的變量。 這是我聲明變量的地方:

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 機器人,作為 MemberCount function,所以它創建了一個頻道,顯示 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);
}

由於消息是異步的,因此您不能在其他地方同步使用它。 我認為在這里,而不是導入 GuildId 的其他文件,讓您的文件將成員計數文件導入為 function,因此您可以在消息出現時在需要時檢索成員計數:

// 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
});

您已經在實施正確的解決方案來跨模塊共享變量。 但是,問題是您的變量正在存儲一個值 - 在這種情況下,我假設一個字符串或數字。 在這種情況下,每個模塊都將獲得該值的副本。

您需要的是導出指針/引用。 為此,您需要導出 object 或數組。 在這種情況下,最好的解決方案是導出 object:

另一個問題是你在回調中聲明(var)你想要的變量。 這使得回調的 scope 之外的代碼無法訪問。 您需要在與您的module.exports共享的 scope 中聲明它

var globals = {}

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

module.exports.globals = globals;

現在您可以導入它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM