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] }); }, };
代码说明
- 角色排序与过滤:将角色按位置倒序排列,确保高权限角色优先展示,同时排除
@everyone减少不必要的字符占用。 - 动态拼接:遍历角色时检查拼接后的字符串长度,预留足够空间给剩余角色提示,避免超出1024字符限制。
- 剩余角色提示:当角色列表超长时,截断并添加
+X个其他角色,清晰告知用户还有未展示的角色。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

