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

Discord社区机器人Embed字段长度超限报错求助

问题排查与解决

错误原因

从报错日志能直接定位问题:

constraint: 's.number.lessThanOrEqual',
given: 26,
expected: 'expected <= 25'

Discord的Embed组件对字段name有严格长度限制——最多只能是25个字符。你的第二个else if分支里,某个玩家的playername + ' : '总长度达到了26,超出限制后触发了@discordjs/builders的校验报错。第一个分支正常是因为该分支下的玩家名称加后缀后长度都控制在25以内。

解决方案

核心思路是截断过长的玩家名称,确保加上后缀后的总长度不超过25。以下是修改后的代码:

基础修复版

for (let i = 0; i < body.players.length; i++) {
  const player = body.players[i];
  // 预留2个字符给后缀" : ",所以用户名最多取23个字符
  const truncatedName = player.playername.slice(0, 23);
  const fieldName = `${truncatedName} : `;

  if (player.votes >= myToken[0]['palier1'] && player.votes < myToken[0]['palier2']) {
    embed50.addFields({
      name: fieldName,
      value: `${player.votes} votes !`,
      inline: true,
    });
  } else if (player.votes >= myToken[0]['palier2']) {
    embed100.addFields({
      name: fieldName,
      value: `${player.votes} votes !`,
      inline: true,
    });
  }
}

优化体验版(添加省略号提示)

如果玩家名称被截断,给末尾加省略号更直观:

function createVoteField(player) {
  const maxNameLength = 23;
  // 名称过长时截断并添加省略号
  const truncatedName = player.playername.length > maxNameLength 
    ? `${player.playername.slice(0, maxNameLength)}...` 
    : player.playername;
  return {
    name: `${truncatedName} : `,
    value: `${player.votes} votes !`,
    inline: true,
  };
}

for (let i = 0; i < body.players.length; i++) {
  const player = body.players[i];
  if (player.votes >= myToken[0]['palier1'] && player.votes < myToken[0]['palier2']) {
    embed50.addFields(createVoteField(player));
  } else if (player.votes >= myToken[0]['palier2']) {
    embed100.addFields(createVoteField(player));
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:55:27