Discord.js Embed报ExpectedConstraintError问题排查(ES6模块)
Discord机器人权限查询功能报错问题
问题详情
我正在开发一款Discord机器人,功能是列出服务器(Guild)内任意用户的权限。当目标用户拥有被“追踪”的权限时,代码运行完全正常;但当用户没有这类权限时,本该显示No Special Permissions,却触发了一堆错误。
注:我已经加了调试语句尝试排查问题。
代码片段
if (interaction.commandName === 'user') { let manageUser = interaction.options.getUser('target') const manageMember = interaction.guild.members.cache.get(manageUser.id); const accountDate = manageUser.createdAt; const joinDate = interaction.guild.members.cache.get(manageUser.id).joinedAt; const joinDateTimestamp = Math.floor(joinDate.getTime() / 1000); const accountAgeTimestamp = Math.floor(accountDate.getTime() / 1000); const roles = interaction.guild.members.cache.get(manageUser.id).roles.cache .filter(role => role.name !== '@everyone') .map(role => `<@&${role.id}>`).join('\n'); const numberOfRoles = roles.split('\n').length; const trackedPermissions = [ PermissionsBitField.Flags.Administrator, PermissionsBitField.Flags.ManageGuild, PermissionsBitField.Flags.ManageRoles, PermissionsBitField.Flags.ManageChannels, PermissionsBitField.Flags.ManageWebhooks, PermissionsBitField.Flags.ManageGuildExpressions, PermissionsBitField.Flags.ManageNicknames, PermissionsBitField.Flags.MentionEveryone, PermissionsBitField.Flags.BanMembers, PermissionsBitField.Flags.KickMembers, PermissionsBitField.Flags.ModerateMembers, PermissionsBitField.Flags.ManageMessages, PermissionsBitField.Flags.ManageThreads, PermissionsBitField.Flags.ManageEvents, PermissionsBitField.Flags.ViewAuditLog, PermissionsBitField.Flags.CreateInstantInvite, ] let filteredPermissions = '`No Special Permissions`' if (trackedPermissions.some((permission) => manageMember.permissions.has(permission))) { const permissionsFound = trackedPermissions.filter((permission) => manageMember.permissions.has(permission) ); filteredPermissions = permissionsFound .map((permission) => `\`${permissionNames[permission]}\``) .join('\n'); } console.log(`Permissions:\n${filteredPermissions}`) const embed = new EmbedBuilder() .setColor('#aa99ef') .setTitle(`User Management | ${manageUser.username}`) .setThumbnail(`${manageUser.displayAvatarURL()}`) .setDescription(`### <:fairifyUser:1141513576608170004> **User ID:** \`${manageUser.id}\` `) .addFields( { name: '<:fairifyDate:1145094016824778846> Account Created', value: `<t:${accountAgeTimestamp}:R>`, inline: true }, { name: '<:fairifyDate:1145094016824778846> Member Since', value: `<t:${joinDateTimestamp}:R>`, inline: true }, { name: `<:fairifyRoles:1173816294039105647> ${numberOfRoles === 1 ? '1 Role' : `${numberOfRoles} Roles`}`, value: `${roles}`, inline: false }, { name: '<:fairifyPermissions:1173827440255172680> Permissions', value: `${filteredPermissions}`, inline: false } ) .setTimestamp(Date.now()) .setFooter({ text: `${VERSION}`, }); await interaction.reply({ embeds: [embed], ephemeral: true }); }
控制台输出
Permissions: `No Special Permissions` node:events:504 throw er; // Unhandled 'error' event ^ CombinedPropertyError: Received one or more errors at ArrayValidator.handle (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:473:70) at ArrayValidator.parse (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:212:88) at EmbedBuilder.addFields (D:\Documents\Discord\FairifyBot\node_modules\@discordjs\builders\dist\index.js:225:31) at Client.<anonymous> (file:///D:/Documents/Discord/FairifyBot/index.js:659:10) at Client.emit (node:events:526:28) at InteractionCreateAction.handle (D:\Documents\Discord\FairifyBot\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12) at Object.module.exports [as INTERACTION_CREATE] (D:\Documents\Discord\FairifyBot\node_modules\discord.js\src\client\websocket\handlers\INTERACTION_CREATE.js:4:36) at WebSocketManager.handlePacket (D:\Documents\Discord\FairifyBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:355:31) at WebSocketManager.<anonymous> (D:\Documents\Discord\FairifyBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:239:12) at WebSocketManager.emit (D:\Documents\Discord\FairifyBot\node_modules\@vladfrangu\async_event_emitter\dist\index.js:282:31) Emitted 'error' event on Client instance at: at emitUnhandledRejectionOrErr (node:events:383:10) at processTicksAndRejections (node:internal/process/task_queues:85:21) { errors: [ [ 2, CombinedPropertyError: Received one or more errors at ObjectValidator.handleIgnoreStrategy (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:1268:70) at ObjectValidator.handleStrategy (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:1121:47) at ObjectValidator.handle (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:1221:17) at ObjectValidator.run (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:198:23) at ArrayValidator.handle (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:467:37) at ArrayValidator.parse (D:\Documents\Discord\FairifyBot\node_modules\@sapphire\shapeshift\dist\index.js:212:88) at EmbedBuilder.addFields (D:\Documents\Discord\FairifyBot\node_modules\@discordjs\builders\dist\index.js:225:31) at Client.<anonymous> (file:///D:/Documents/Discord/FairifyBot/index.js:659:10) at Client.emit (node:events:526:28) at InteractionCreateAction.handle (D:\Documents\Discord\FairifyBot\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12) { errors: [ [ 'value', [ExpectedConstraintError] ] ] } ] ] }
我一般能自己搞定问题,但这次卡了好几个小时,试了把filteredPermissions设成字符串、数组,也试过映射“No Special Permissions”,结果还是一样的错误。
解决方法
报错根源是Embed字段的value不能为空字符串。当目标用户只有默认的@everyone角色时,roles变量会变成空字符串,触发了Discord.js的字段验证错误。
修改代码如下:
- 给
roles添加默认值,无额外角色时显示\No Roles``:
const roles = interaction.guild.members.cache.get(manageUser.id).roles.cache .filter(role => role.name !== '@everyone') .map(role => `<@&${role.id}>`).join('\n') || '`No Roles`';
- 同步调整角色数量的计算逻辑,避免空字符串导致的错误计数:
const numberOfRoles = roles === '`No Roles`' ? 0 : roles.split('\n').length;
修改后,所有Embed字段都不会出现空值,就能正常生成消息,不会再触发CombinedPropertyError了。
内容的提问来源于stack exchange,提问作者RealCraze
相关产品推荐
相关产品推荐

