Discord.js如何使用.deferReply向指定频道发送消息?
问题解决
报错根因
deferReply()、editReply()是交互(interaction)对象的专属方法,用于处理触发斜杠命令的用户的交互响应,频道(GuildChannel)对象本身不存在这两个方法,所以调用时会抛出类型错误。- 向指定频道发送消息不需要调用交互相关方法,直接使用频道对象的
send()方法即可实现。
修正后代码
const { SlashCommandBuilder } = require("@discordjs/builders"); const { MessageEmbed } = require("discord.js"); module.exports = { data: new SlashCommandBuilder() .setName("suggest") .setDescription("向指定频道发送你的建议") .addStringOption((option) => option .setName("suggestion") .setDescription("你要提交的建议内容") .setRequired(true) ), async execute(interaction, client) { const suggestionChannelID = "900982140504793109"; const suggestionChannel = client.channels.cache.get(suggestionChannelID); // 先响应用户交互,避免3秒超时导致命令报错,ephemeral设为true则只有触发用户能看到这条回复 await interaction.deferReply({ ephemeral: true }); const embed = new MessageEmbed() .setColor("#0099ff") .setTitle(`${interaction.member.displayName} 提交了新建议`) .setDescription(interaction.options.getString("suggestion")); // 向建议频道发送embed消息 const suggestionMsg = await suggestionChannel.send({ embeds: [embed] }); // 给消息添加正反反应 await suggestionMsg.react("👍"); await suggestionMsg.react("👎"); // 回复用户提交成功 await interaction.editReply("你的建议已成功提交至对应频道,感谢反馈!"); } };
注意事项
- 请确保机器人拥有目标建议频道的
发送消息、嵌入链接、添加反应权限,否则会触发权限类报错。 - 如果你使用的是discord.js v14及以上版本,需要将
MessageEmbed替换为EmbedBuilder,导入路径和构造写法对应调整即可。
内容的提问来源于stack exchange,提问作者Koto
相关产品推荐
相关产品推荐

