You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js中Unban命令Try Catch未生效,触发DiscordAPIError[10026]

问题分析与解决

你的unban命令里try/catch不触发的核心原因是:interaction.guild.members.unban(user)是异步方法,它返回一个Promise,但你没有用await等待它完成,导致异步操作的错误无法被同步的try/catch捕获,错误会变成未处理的Promise拒绝,而不是进入catch块。

修复步骤

  1. 在unban调用前添加await关键字,让异步操作的错误能被try/catch捕获
  2. 修正代码里的拼写错误:spesified改为specified(不影响功能,但更规范)
  3. 补全缺失的SlashCommandBuilder导入,原代码未显式导入该类

修改后的完整代码

const { Console } = require('console');
const fs = require('fs');
const { EmbedBuilder, SlashCommandBuilder } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('unban')
        .setDescription('Unbans the specified user.')
        .addUserOption(option => option
            .setName('target')
            .setDescription('The user to unban.')
            .setRequired(true)),
    async execute(interaction) {
        let is_admin = false;
        
        const server_data_path = `./data/${interaction.guild.id}.json`;
        
        if (fs.existsSync(server_data_path)) {
            const rawdata = fs.readFileSync(server_data_path);
            const server_data = JSON.parse(rawdata);

            const sender_id = interaction.user.id;

            if(server_data.admin.includes(sender_id)){
                is_admin = true;
            }
        }

        if(is_admin){
            const user = interaction.options.getUser('target').id;

            try{
                await interaction.guild.members.unban(user);

                const success_embed = new EmbedBuilder()
                    .setColor('00ff00')
                    .setTitle(`Unbanned: ${user}.`);
                await interaction.reply({ embeds: [success_embed] });
                setTimeout(() => interaction.deleteReply(), 5000);
            }catch (error){
                console.error(error);
                const error_embed = new EmbedBuilder()
                    .setColor('ff0000')
                    .setTitle("Could not unban the target.")
                    .setDescription(`Error: ${error.message}`);
                await interaction.reply({ embeds: [error_embed], ephemeral: true });
                setTimeout(() => interaction.deleteReply(), 5000);
            }
        }else{
            const error_embed = new EmbedBuilder()
                .setColor('ff0000')
                .setTitle("You must be an admin to use this command.");
            await interaction.reply({ embeds: [error_embed], ephemeral: true });
            setTimeout(() => interaction.deleteReply(), 5000);
        }
    },
};

额外优化点

  • 给未声明的is_admin添加let声明,避免全局变量污染
  • 用模板字符串替代字符串拼接,代码更简洁易读
  • 在catch块打印错误到控制台,方便调试问题
  • 给错误回复添加ephemeral: true,仅命令执行者可见,减少频道干扰
  • 给interaction.reply添加await,确保回复完成后再执行删除操作

内容的提问来源于stack exchange,提问作者user18339230

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:30:58