Почему аргумент «взаимодействие» не определен в этом скрипте регистрации файлов?

#javascript #node.js #discord.js #undefined

Вопрос:

Я нахожусь в середине (полууспешно) обучения использованию новых команд косой черты в Discord.js, а node.js модуль для взаимодействия с API ботов Discord. Насколько я могу видеть, это строго проблема с базовым кодом Javascript, и никаких знаний о Discord.js требуется, чтобы помочь моей довольно досадной маленькой проблеме!

Код предназначен для извлечения файлов событий и их выполнения. Проблема в том, что всякий interactionCreate.js раз, когда файл выполняется, interaction аргумент кажется неопределенным.

При необходимости структура файла выглядит следующим образом:

 project-folder/
├── index.js
├── events/
    └── interactionCreate.js
 

Вот index.js :

 const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js'));

for (const file of eventFiles) {
    const event = require(`./events/${file}`);
    if (event.once) {
        client.once(event.name, (...args) => event.execute(...args));
    } else {
        client.on(event.name, (...args) => event.execute(...args));
    }
}
 

…и вот interactionCreate.js :

 module.exports = {
    name: 'interactionCreate',
    async execute(client, interaction) {
        if (!interaction.isCommand()) return;

        const command = client.commands.get(interaction.commandName);

        if (!command) return;

        try {
            await command.execute(interaction);
        } catch (error) {
            console.error(error);
            await interaction.reply({ content: 'There was an error while executing this command.', ephemeral: true });
        }
    },
};
 

Я не совсем уверен, имеет ли это отношение к делу, но вот как выглядит код, когда он не находится в отдельных модулях. Конечно, поиск файлов событий здесь не требуется.

index.js (before modularisation) :

 client.on('interactionCreate', async interaction => {
    if (!interaction.isCommand()) return;
    const command = client.commands.get(interaction.commandName);

    if (!command) return;

    try {
        await command.execute(interaction);
    } catch (error) {
        console.error(error);
        await interaction.reply({ content: 'There was an error while executing this command.', ephemeral: true });
    }
});
 

Опять же, я не уверен, нужно ли это, но вот одно из сообщений об ошибках, которые я получу.

 C:pathtofilesproject-foldereventsinteractionCreate.js:4
                if (!interaction.isCommand()) return;
                                 ^
TypeError: Cannot read properties of undefined (reading 'isCommand')
 

У меня не слишком большой опыт в том, чтобы задавать здесь вопросы, поэтому, если вам понадобится что-нибудь еще, дайте мне знать! Я с радостью либо отвечу на ваш ответ, либо обновлю вопрос. Большое спасибо!

Ответ №1:

Ваше заявление выглядит так:

 async execute(client, interaction) {
  //...
}
 

И interactionCreate событие предоставляет только 1 параметр ( interaction ). Если бы все ваши события были расположены в client, rest, of, the, args порядке параметров, это был бы правильный подход:

 if (event.once) {
  client.once(event.name, (...args) => event.execute(client, ...args));
} else {
  client.on(event.name, (...args) => event.execute(client, ...args));
}
 

Комментарии:

1. Ах, он все это время смотрел мне в лицо! Огромное спасибо, чувак.

2. Хм, только что попробовал. Похоже, это не сработало. Я получаю следующую ошибку: TypeError: Cannot read properties of undefined (reading 'isCommand')

3. Действительно? Это та же линия?

4. Моя вина, если вы используете верхнюю index.js есть другая проблема, отредактируйте ответ сейчас…

5. Я отредактировал его для первого index.js