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

Discord.js导出服务器封禁列表slash命令运行报错问题咨询

问题根因

  • 第一个错误Cannot send an empty message有三个触发原因:
    1. 你写的new_paste是回调式异步函数,同步调用时根本拿不到返回值,赋值给fe的就是undefined,传给editReply自然就成了空内容
    2. interaction.deferReply()方法不支持直接传字符串,必须传入配置对象,正确写法是await interaction.deferReply({ content: 'xxx' })
    3. 你调用new_paste时传的interaction.serverName不存在,discord.js里获取当前服务器名称的属性是interaction.guild.name
  • 第二个错误INTERACTION_ALREADY_REPLIED是因为你项目根目录的index.js里的命令执行逻辑有问题:大概率是你在捕获命令执行错误时,没有判断当前交互是否已经延迟回复/已经回复,就又调用了一次interaction.reply(),导致重复回复报错。

修复方案

第一步:修改export-ban-list.js代码

把回调式的new_paste改成Promise版本,调整参数错误,代码如下:

const { SlashCommandBuilder } = require('@discordjs/builders');
const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');
const { token, pasteUser, pastePass, pasteKey } = require('../config.json');

const paste = require('better-pastebin');

const rest = new REST({ version: '9' }).setToken(token);
paste.setDevKey(pasteKey);
paste.login(pasteUser, pastePass);

// 改成Promise版本方便await拿结果
function new_paste(serverName, results) {
    const date = new Date();
    const outputFile = `${serverName}-${date.toISOString().replace(/[:.]/g, '-')}.txt`;
    return new Promise((resolve) => {
        paste.create({
            contents: results,
            name: outputFile,
            expires: '1D',
            anonymous: 'true',
        },
        function(success, data) {
            if (success) {
                resolve(data);
            }
            else {
                resolve('导出列表时出现意外错误。');
            }
        });
    })
}

module.exports = {
    data: new SlashCommandBuilder()
        .setName('export-ban-list')
        .setDescription('导出当前服务器的封禁列表'),

    async execute(interaction) {
        const bans = await rest.get(
            Routes.guildBans(interaction.guildId),
        );
        // 修正deferReply的参数格式
        await interaction.deferReply({ content: `找到 ${bans.length} 条封禁记录,正在导出...` });
        console.log(`找到 ${bans.length} 条封禁记录,正在导出...`);

        const results = JSON.stringify(bans.map(v => v.user.id));
        // 等待pastebin返回结果
        const fe = await new_paste(interaction.guild.name, results);
        return interaction.editReply({ content: fe });

    },
};

第二步:修复index.js的命令执行逻辑

找到你index.js里处理命令执行的部分,在错误捕获的逻辑里加判断,示例如下:

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);
        // 加这个判断,避免重复回复
        if (interaction.deferred || interaction.replied) {
            await interaction.editReply({ content: '命令执行时出现错误,请稍后再试。' });
        } else {
            await interaction.reply({ content: '命令执行时出现错误,请稍后再试。', ephemeral: true });
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:15:03