[英]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.