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
相关产品推荐
相关产品推荐

