TypeErr: Не удается прочитать свойство «роли» неопределенного

#javascript #discord.js

Вопрос:

Я пытаюсь создать систему кнопок, в которой, если у вас нет определенной роли, вы не сможете использовать кнопку. Однако созданный мной код, похоже, не работает.

 collector.on('collect', async interaction => {
        const wikiStaffRole = interaction.user.guild.roles.cache.find(role => role.name == "Staff");

        if (interaction.customId === "yes") {
          if (!wikiStaffRole) {
            return interaction.followUp({ content: `${interaction.user} dude you need to be a staff member`, ephmeral: true });
          }
          newUserEmbed.edit({ embeds: [], content: 'This report has been marked as completed.', components: [] });
          return;
         } else if (interaction.customId === "no") {
          if (!wikiStaffRole) {
            return interaction.followUp({ content: `${interaction.user} dude you need to be a staff member`, ephmeral: true });
          }
          newUserEmbed.edit({ embeds: [], content: 'This report has been denied.', components: [] });
          return;
        } else if (interaction.customId === "what") {
          if (!wikiStaffRole) {
            return interaction.followUp({ content: `${interaction.user} dude you need to be a staff member`, ephmeral: true });
          }
          newUserEmbed.edit({ embeds: [], content: 'This report has been marked as inconclusive.', components: [] });
          return;
        }
        });
 

Вместо этого я просто получаю сообщение об ошибке, в котором говорится, что он не может прочитать свойство «роли» неопределенного. Я не могу придумать никаких способов исправить это.

Ответ №1:

Вы попытались получить доступ к несуществующему guild свойству User объекта. Это свойство не существует в User s, но существует в GuildMember Interaction объектах и. Этот код должен работать:

 const wikiStaffRole = interaction.guild.roles.cache.find(role => role.name == "Staff")
 

Имейте в виду, что если его нет в гильдии, это приведет к ошибке. Вы можете использовать необязательную цепочку ( ?. ), чтобы предотвратить это

 const wikiStaffRole = interaction.guild?.roles.cache.find(role => role.name == "Staff")
 

Я думаю, вы хотели проверить, была ли у участника эта роль. Вы на самом деле проверяете, имеет ли роль весь сервер. Это позволит проверить только роли участников

 const wikiStaffRole = interaction.member?.roles.cache.find(role => role.name == "Staff")
//optional chaining because member would be null if it was sent in a DM