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

Discord info server子命令Embed不显示、交互失败无报错如何修复

修复方案

核心错误点

  1. 在线人数统计字段错误
    你写的Online字段直接返回了过滤后的成员集合对象,没有取.size属性,同时未处理部分成员presence属性为空的情况,这是触发interaction failed的直接原因:Embed字段只能接收字符串/数字类型,无法序列化对象,同时访问不存在的presence.status会抛出未捕获异常。
  2. 频道类型枚举值不匹配
    discord.js v13及以上版本中,文字频道类型枚举值为GUILD_TEXT、语音频道为GUILD_VOICE,旧版的text/voice已失效,会导致频道统计返回0。
  3. 缺少必要网关意图
    要正常拉取全量成员列表、读取在线状态,需要在机器人客户端初始化时开启GUILD_MEMBERS、GUILD_PRESENCES意图,否则members.fetch()也无法拿到全量成员,会导致Bot数量统计错误。
  4. 交互超时风险
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:27:01