Discord.js导出服务器封禁列表slash命令运行报错问题咨询
问题根因
- 第一个错误
Cannot send an empty message有三个触发原因:- 你写的
new_paste是回调式异步函数,同步调用时根本拿不到返回值,赋值给fe的就是undefined,传给editReply自然就成了空内容 interaction.deferReply()方法不支持直接传字符串,必须传入配置对象,正确写法是await interaction.deferReply({ content: 'xxx' })- 你调用
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
相关产品推荐
相关产品推荐

