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

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的字段验证错误。

修改代码如下:

  1. 给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`';
  1. 同步调整角色数量的计算逻辑,避免空字符串导致的错误计数:
const numberOfRoles = roles === '`No Roles`' ? 0 : roles.split('\n').length;

修改后,所有Embed字段都不会出现空值,就能正常生成消息,不会再触发CombinedPropertyError了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:39:53