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

Discord.js v14 serverinfo命令字符串长度超限问题求助

解决Discord.js v14 Serverinfo命令角色列表超长问题

问题

使用Discord.js v14开发serverinfo斜杠命令时,在角色较多的服务器执行会触发ExpectedConstraintError,错误提示字符串长度超过1024字符限制——这是因为Discord Embed的字段值最大长度为1024,直接拼接所有角色提及会超出该限制。

错误信息

CombinedPropertyError (1)
  Received one or more errors

  input[6]
  | CombinedPropertyError (1)
  |   Received one or more errors
  | 
  |   input.value
  |   | ExpectedConstraintError > s.string.lengthLessThanOrEqual
  |   |   Invalid string length
  |   | 
  |   |   Expected: expected.length <= 1024
  |   | 
  |   |   Received:
  |   |   | '<@&289463765118746636>, <@&368715035410956289>, <@&289485329277255690>, <@&390953914662649856>, <@&534842283422384133>, <@&415871527607730176>, <@&609326498863906829>, <@&489773200734158848>, <@&369558361508675584>, <@&534842280826241024>, <@&382268555514609674>, <@&534842279991443456>, <@&607222382134034433>, <@&430023080342192138>, <@&572746958280589324>, <@&538123328452427807>, <@&424561276035792926>, <@&607150665407397888>, <@&534842282176675843>, <@&538123326921637919>, <@&573859029684846623>, <@&608292634535919637>, <@&538109688441470989>, <@&365555582033461258>, <@&607923580092547086>, <@&606790273745289217>, <@&573855539704889402>, <@&289458849822277632>, <@&534842282709352458>, <@&538109682309529626>, <@&573859302067011584>, <@&411505463843356673>, <@&538109687221190697>, <@&277926713676267521>, @everyone, <@&534842281254060054>, <@&289825650238554114>, <@&369514554356662272>, <@&538109686080339988>, <@&368049921942749205>, <@&538109688714231820> 

原代码

const {
  SlashCommandBuilder,
  EmbedBuilder
} = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("serverinfo")
    .setDescription("Provides information about the server.")
    .setDMPermission(false),

  async execute(client, interaction) {
    const { guild } = interaction;
    const { members, channels, emojis, roles, stickers } = guild;

    const embed = new EmbedBuilder()
      .setColor('#2B2D31')
      .setTitle(`Server info - ${guild.name}`)
      .setFooter({text: `Server ID: ${guild.id} | Server Created: ${guild.createdAt.toDateString()}`})
      .setThumbnail(guild.iconURL({ size: 256 }))
      .setImage(guild.bannerURL({ size: 256 }))
      .addFields(
        { name: 'Owner', value: (await guild.fetchOwner()).user.tag, inline: true },
        {
          name: 'Text Channels',
          value: guild.channels.cache.filter((c) => c.type === 0).size.toString(),
          inline: true,
        },
        {
          name: 'Voice Channels',
          value: guild.channels.cache.filter((c) => c.type === 2).size.toString(),
          inline: true,
        },
        {
          name: 'Category Channels',
          value: guild.channels.cache.filter((c) => c.type === 4).size.toString(),
          inline: true,
        },
        { name: 'Members', value: guild.memberCount.toString(), inline: true },
        { name: 'Roles', value: guild.roles.cache.size.toString(), inline: true },
        { name: 'Role List', value: guild.roles.cache.toJSON().join(', ') },
      );
    interaction.reply({ embeds: [embed] });
  },
};

解决方案

通过动态拼接角色列表,在接近1024字符上限时停止,剩余角色用“+X个其他角色”补充。同时可以选择排除@everyone角色(它默认存在且通常不需要展示),减少字符占用。

修改后的代码

const {
  SlashCommandBuilder,
  EmbedBuilder
} = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("serverinfo")
    .setDescription("Provides information about the server.")
    .setDMPermission(false),

  async execute(client, interaction) {
    const { guild } = interaction;
    const { members, channels, emojis, roles, stickers } = guild;

    // 处理角色列表,避免超长
    let roleList = '';
    let remainingRoles = 0;
    // 按角色位置倒序(高权限角色在前),排除@everyone
    const sortedRoles = guild.roles.cache.filter(role => role.id !== guild.id).sort((a, b) => b.position - a.position);
    
    for (const role of sortedRoles.values()) {
      const roleMention = `<@&${role.id}>, `;
      // 检查添加后是否超过1024字符,预留空间给后续的"+X个其他角色"
      if (roleList.length + roleMention.length + 20 > 1024) { // 20是预留的" + X个其他角色"的大致长度
        remainingRoles++;
      } else {
        roleList += roleMention;
      }
    }

    // 移除末尾的逗号空格,并添加剩余角色提示
    if (remainingRoles > 0) {
      roleList = roleList.slice(0, -2) + ` + ${remainingRoles}个其他角色`;
    } else {
      roleList = roleList.slice(0, -2) || '无';
    }

    const embed = new EmbedBuilder()
      .setColor('#2B2D31')
      .setTitle(`Server info - ${guild.name}`)
      .setFooter({text: `Server ID: ${guild.id} | Server Created: ${guild.createdAt.toDateString()}`})
      .setThumbnail(guild.iconURL({ size: 256 }))
      .setImage(guild.bannerURL({ size: 256 }))
      .addFields(
        { name: 'Owner', value: (await guild.fetchOwner()).user.tag, inline: true },
        {
          name: 'Text Channels',
          value: guild.channels.cache.filter((c) => c.type === 0).size.toString(),
          inline: true,
        },
        {
          name: 'Voice Channels',
          value: guild.channels.cache.filter((c) => c.type === 2).size.toString(),
          inline: true,
        },
        {
          name: 'Category Channels',
          value: guild.channels.cache.filter((c) => c.type === 4).size.toString(),
          inline: true,
        },
        { name: 'Members', value: guild.memberCount.toString(), inline: true },
        { name: 'Roles', value: guild.roles.cache.size.toString(), inline: true },
        { name: 'Role List', value: roleList },
      );
    interaction.reply({ embeds: [embed] });
  },
};

代码说明

  1. 角色排序与过滤:将角色按位置倒序排列,确保高权限角色优先展示,同时排除@everyone减少不必要的字符占用。
  2. 动态拼接:遍历角色时检查拼接后的字符串长度,预留足够空间给剩余角色提示,避免超出1024字符限制。
  3. 剩余角色提示:当角色列表超长时,截断并添加+X个其他角色,清晰告知用户还有未展示的角色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:54:55