斜杠命令处理程序中的 Discord.js v13 TypeError

Posted

技术标签:

【中文标题】斜杠命令处理程序中的 Discord.js v13 TypeError【英文标题】:Discord.js v13 TypeError in slash command handler 【发布时间】:2021-12-15 19:54:04 【问题描述】:

我想创建一个基本的静音命令,它只是向用户添加一个没有时间参数的角色,我如何在 Discord.js v13 中实现它?我已经有斜杠命令和处理程序命令设置,但是我收到以下错误:

TypeError: Cannot read properties of undefined (reading 'cache')

我的代码:

const  SlashCommandBuilder  = require("@discordjs/builders")
const  MessageEmbed  = require("discord.js")
const Discord = require("discord.js")

module.exports = 
    data: new SlashCommandBuilder()
    .setName("mute")
    .setDescription("El bot muteara a un usuario del server")
    .addUserOption(option => 
        option
        .setName("miembro") // target
        .setDescription("Mencione al miembro que desea mutear")
        .setRequired(true)
    )
    .addStringOption(option => 
        option
        .setName("razon") // reason
        .setDescription("Razon por la que el usuario sera muteado")
        .setRequired(true)
    ),

    async run(client, interaction)
        const target = interaction.options.getUser("miembro");
        const reason = interaction.options.getString("razon");

        if(!interaction.guild.roles.cache.get('902652079762468975')) return interaction.followUp( embeds: [new MessageEmbed().setColor("RED").setDescription("El rol de muteado no existe")])
        await target.roles.cache.add("902652079762468975");
        interaction.followUp( embeds: [new MessageEmbed().setColor("GREEN").setDescription(`✅ $target ha sido muteado. Razon:$reason`)])
    

【问题讨论】:

你能详细说明一下吗?例如,名为“run”的异步函数中的interaction参数是什么? 哪个缓存触发了错误? DJS13 改变了很多东西,其中之一是内部缓存。 【参考方案1】:

这是最终代码

async run(client, interaction)
    const target = interaction.options.getMember("miembro");
    const reason = interaction.options.getString("razon");
    
    const embed = new Discord.MessageEmbed()
    .setColor("GREEN")
    .setDescription(`✅ $target has been muted. Reason:$reason`)

    await target.roles.add('role-id');
    interaction.reply( embeds: [embed])

【讨论】:

【参考方案2】:

假设您使用的是最新版本的 djs13,您希望使用 option.getMember() 而不是 option.getUser

getUser 返回没有任何公会信息(包括角色)的User 对象。 getMember 返回引用角色缓存的 GuildMember 对象。这仅在从公会频道触发命令时才有效。

如果您希望您的命令在公会之外可用,您必须使用 getUser 并手动在公会的成员缓存中查找用户的 id。

这可能需要更改您的命令注册以适应值类型的更改。

Documentation

【讨论】:

以上是关于斜杠命令处理程序中的 Discord.js v13 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

如何将斜杠命令隐藏到特定用户或频道 Discord.js v13

如何使用 discord.js 调用 SubCommand 的选项? (v13)

Discord.js V13 使用斜线命令时添加角色

Discord.js v13,@discordjs/voice 播放音乐命令

Ping 为负值(Discord.js v13)

Discord.js v13 语音通道数据未更新