Discord info server子命令Embed不显示、交互失败无报错如何修复
修复方案
核心错误点
- 在线人数统计字段错误
你写的Online字段直接返回了过滤后的成员集合对象,没有取.size属性,同时未处理部分成员presence属性为空的情况,这是触发interaction failed的直接原因:Embed字段只能接收字符串/数字类型,无法序列化对象,同时访问不存在的presence.status会抛出未捕获异常。 - 频道类型枚举值不匹配
discord.js v13及以上版本中,文字频道类型枚举值为GUILD_TEXT、语音频道为GUILD_VOICE,旧版的text/voice已失效,会导致频道统计返回0。 - 缺少必要网关意图
要正常拉取全量成员列表、读取在线状态,需要在机器人客户端初始化时开启GUILD_MEMBERS、GUILD_PRESENCES意图,否则members.fetch()也无法拿到全量成员,会导致Bot数量统计错误。 - 交互超时风险
server子命令包含两次API请求,可能超出Discord交互3秒响应限制,建议进入子命令逻辑前先调用deferReply预响应。
修正后的server子命令代码
} else if (interaction.options.getSubcommand() === "server") { // 先预响应避免超时 await interaction.deferReply(); const server = interaction.guild; const owner = await client.users.fetch(server.ownerId); const members = await server.members.fetch(); const channels = server.channels.cache; const emojis = server.emojis.cache; const serverEmbed = new MessageEmbed() .setTitle(`${server.name}'s Information`) .setAuthor(server.name, server.iconURL() ?? '') .setThumbnail(client.user.displayAvatarURL()) .addFields( { name: `Owner`, value: `<@${server.ownerId}>, ${owner.tag}` }, { name: `Server ID`, value: `${server.id}`, inline: true }, { name: `Total Members`, value: `${server.memberCount}`, inline: true }, { name: `Time created`, value: `${moment(server.createdTimestamp).format("LT")}, ${moment(server.createdTimestamp).format("LL")}, ${moment(server.createdTimestamp).fromNow()}`}, { name: `Emojis`, value: `${emojis.size}`}, {name: `Regular emojis`, value: `${emojis.filter(emoji => !emoji.animated).size}`}, {name: `Animated emojis`, value: `${emojis.filter(emoji => emoji.animated).size}`}, {name: `Human`, value: `${members.filter(member => !member.user.bot).size}`}, {name: `Bots`, value: `${members.filter(member => member.user.bot).size}`}, {name: `Text channels`, value: `${channels.filter(channel => channel.type === "GUILD_TEXT").size}`}, {name: `Voice channels`, value: `${channels.filter(channel => channel.type === "GUILD_VOICE").size}`}, {name: `Boost`, value: `${server.premiumSubscriptionCount || "0"}`}, // 修复在线人数统计:加可选链判空 + 取size {name: `Online`, value: `${members.filter(member => member.presence?.status === "online").size}`}, ) .setImage(server.iconURL() ?? '') .setTimestamp() .setColor("#F2A4D3") .setFooter(client.user.tag, client.user.displayAvatarURL()); // 用editReply回复预响应的交互 await interaction.editReply({ embeds: [serverEmbed] }); }
额外配置检查
在你初始化Client的代码中,确认已经开启必要意图:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS, // 拉取成员列表必需 Intents.FLAGS.GUILD_PRESENCES // 读取在线状态必需 ] });
同时需要在Discord开发者后台的机器人设置页,打开Privileged Gateway Intents下的Server Members Intent和Presence Intent开关。
内容的提问来源于stack exchange,提问作者Charlotte Rong
相关产品推荐
相关产品推荐

