#javascript #node.js #discord #discord.js #event-handling
Вопрос:
Так что я работал над ботом для разногласий. Сначала я ввел каждый обработчик событий в index.js, что сработало на отлично.
const { Client, Collection, Intents } = require('discord.js'); const { token } = require('./config.json'); const fs = require('fs'); const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS], partials: ['MESSAGE', 'CHANNEL', 'REACTION'], }); client.commands = new Collection(); const commandFiles = fs.readdirSync('./commands').filter(file =gt; file.endsWith('js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); client.commands.set(command.data.name, command); } client.once('ready', () =gt; { console.log('Ready!'); }); client.on('interactionCreate', async interaction =gt; { if (!interaction.isCommand()) return; const command = client.commands.get(interaction.commandName); if (!command) return; try { await command.execute(interaction); } catch (err) { console.log(err); await interaction.reply('There was an error while executing this command!'); } }); client.on('messageReactionAdd', (reaction, user) =gt; { const channel = client.channels.cache.find(channel =gt; channel.name === "test"); let message = 874736592542105640; let emotes = [ "kannathinking", "🍎"]; let roleID = (reaction.emoji.name == emotes[0] ? "874730080486686730" : "874729987310235738") if (message == reaction.message.id amp;amp; (emotes[0] == reaction.emoji.name || emotes[1] == reaction.emoji.name)) { channel.send(`${user} was given the lt;@amp;${roleID}gt; role`); } }); client.on('messageReactionRemove', (reaction, user) =gt; { const channel = client.channels.cache.find(channel =gt; channel.name === "test"); let message = 874736592542105640; let emotes = [ "kannathinking", "🍎"]; let roleID = (reaction.emoji.name == emotes[0] ? "874730080486686730" : "874729987310235738") if (message == reaction.message.id amp;amp; (emotes[0] == reaction.emoji.name || emotes[1] == reaction.emoji.name)) { channel.send(`${user} was removed from the lt;@amp;${roleID}gt; role`); } }); client.login(token);
Затем я попытался сохранить обработчики событий в отдельных файлах, точно так же, как я делал с командами.
const { Client, Collection, Intents } = require('discord.js'); const { token } = require('./config.json'); const fs = require('fs'); const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS], partials: ['MESSAGE', 'CHANNEL', 'REACTION'], }); client.commands = new Collection(); const commandFiles = fs.readdirSync('./commands').filter(file =gt; file.endsWith('js')); const eventFiles = fs.readdirSync('./events').filter(file =gt; file.endsWith('.js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); client.commands.set(command.data.name, command); } for (const file of eventFiles) { const event = require(`./events/${file}`); if (event.once) { client.once(event.name, (...args) =gt; event.execute(...args)); } else { client.on(event.name, (...args) =gt; event.execute(...args)); } } client.login(token);
Однако это не сработало хорошо. Когда я запустил бота, он дал мне положительный отзыв. Однако, как только я попытался отреагировать на сообщение на моем сервере discord, оно выдало следующую ошибку:
Ошибка типа: не удается прочитать свойства неопределенного (чтение «кэша»)
В messageReactionAdd.js файл события выглядит следующим образом:
module.exports = { name: 'messageReactionAdd', execute(client, reaction, user) { const channel = client.channels.cache.find(channel =gt; channel.name === "test"); let message = 874736592542105640; let emotes = ["kannathinking", "🍎"]; let roleID = (reaction.emoji.name == emotes[0] ? "874730080486686730" : "874729987310235738") if (message == reaction.message.id amp;amp; (emotes[0] == reaction.emoji.name || emotes[1] == reaction.emoji.name)) { channel.send(`${user} was given the lt;@amp;${roleID}gt; role`); } } }
Я попытался исправить ошибку, потребовав объект клиента, который я создал в index.js, а также требовать, чтобы «Клиент» от discord.js. И то, и другое не сработало, и я не могу понять, чего не хватает в файле событий, чтобы он работал.
Ответ №1:
Когда требуется файл события, вы никогда не определяли клиента, поэтому, когда вы вызываете client.channels
обработчик событий, он на самом деле не знает, что client
это такое.
Чтобы устранить эту проблему, при выполнении функции определите клиента перед аргументами.
Пример:
for (const file of eventFiles) { const event = require(`./events/${file}`); if (event.once) { client.once(event.name, (...args) =gt; event.execute(client, ...args)); } else { client.on(event.name, (...args) =gt; event.execute(client, ...args)); } }