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

Discord.js v14权限处理器报错:TypeError读取permission未定义

问题描述

使用Discord.js v14编写权限处理模块时出现报错:

TypeError: Cannot read properties of undefined (reading 'permission')

尝试使用"ADMINISTRATOR"权限后仍触发相同错误,当前代码如下:

const ValidPerms = [
    p.AddReactions,
    p.Administrator,
    p.AttachFiles,
    p.BanMembers,
    p.ChangeNickname,
    p.Connect,
    p.CreateInstantInvite,
    p.CreatePrivateThreads,
    p.CreatePublicThreads,
    p.DeafenMembers,
    p.EmbedLinks,
    p.KickMembers,
    p.ManageChannels,
    p.ManageEmojisAndStickers,
    p.ManageEvents,
    p.ManageGuild,
    p.ManageMessages,
    p.ManageNicknames,
    p.ManageRoles,
    p.ManageThreads,
    p.ManageWebhooks,
    p.MentionEveryone,
    p.ModerateMembers,
    p.MoveMembers,  
    p.MuteMembers,
    p.PrioritySpeaker,
    p.ReadMessageHistory,
    p.RequestToSpeak,
    p.SendMessages,
    p.SendMessagesInThreads,
    p.SendTTSMessages,
    p.Speak,
    p.Stream,
    p.UseApplicationCommands,
    p.UseEmbeddedActivities,
    p.UseExternalEmojis,
    p.UseExternalStickers,
    p.UseVAD,
    p.ViewAuditLog,
    p.ViewChannel,
    p.ViewGuildInsights,
]


if (command.permissions) {
    let invalidPerms = []
    for (const permission of command.permissions) {
        if (!ValidPerms.includes(permission)) {
            console.log(`Invalid Perms`)
        }

        if (!message.members.permission.has(permission)) {
            invalidPerms.push(permission)
        }
    }

    if (invalidPerms.length) {
        const noPermsEmbed = new ME()
            .setColor(config.colors.no)
            .setTitle("Aww~~~ You dont have have permss~")
            .addField('Aweee~~~ you don\'t have permissions to run command:', `\`${command.name}\``)
            .addField('Permission Required', `\`${invalidPerms}\``)
            .setFooter({ text : client.user.username, iconURL : client.user.displayAvatarURL() })
            .setTimestamp()

        return message.channel.send(noPermsEmbed);
    }
}
问题分析与修复

核心错误点

  1. 成员对象拼写错误:message.members是服务器成员集合,单个消息发送者的成员对象应为message.member(单数),直接访问message.members会返回undefined,导致后续读取permission属性报错。
  2. 权限属性拼写错误:Discord.js v14中,成员的权限属性是permissions(复数),而非permission。
  3. 权限枚举导入与使用问题:如果p未正确导入权限枚举,会导致ValidPerms中的值无效;v14推荐使用PermissionsBitField而非旧版Permissions枚举。

修复后的代码示例

// 确保正确导入权限枚举
const { PermissionsBitField } = require('discord.js');

// 用PermissionsBitField的静态属性定义合法权限列表
const ValidPerms = Object.values(PermissionsBitField.Flags);

if (command.permissions) {
    let invalidPerms = [];
    for (const permission of command.permissions) {
        // 检查权限是否合法
        if (!ValidPerms.includes(permission)) {
            console.error(`无效权限: ${permission}`);
            continue;
        }

        // 修正成员对象和权限属性的拼写,添加可选链避免DM频道报错
        if (!message.member?.permissions.has(permission)) {
            // 转换为可读的权限名称
            const permName = typeof permission === 'string' 
                ? permission 
                : Object.keys(PermissionsBitField.Flags).find(key => PermissionsBitField.Flags[key] === permission);
            invalidPerms.push(permName);
        }
    }

    if (invalidPerms.length) {
        const noPermsEmbed = new ME()
            .setColor(config.colors.no)
            .setTitle("哎呀~~~ 你没有执行权限哦~")
            .addField('无法执行的命令:', `\`${command.name}\``)
            .addField('所需权限', `\`${invalidPerms.join('`, `')}\``)
            .setFooter({ text: client.user.username, iconURL: client.user.displayAvatarURL() })
            .setTimestamp();

        // v14发送消息需用embeds数组格式
        return message.channel.send({ embeds: [noPermsEmbed] });
    }
}

额外注意事项

  • Discord.js v14中发送Embed需传入{ embeds: [embed] }格式,不再支持直接传入Embed对象。
  • 建议使用PermissionsBitField.Flags枚举值(如PermissionsBitField.Flags.Administrator)而非字符串,避免大小写或拼写错误。
  • 添加可选链操作符?.(如message.member?.permissions),防止消息来自DM频道时message.member为undefined导致报错。

内容的提问来源于stack exchange,提问作者Shiko Shintaro Ch.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:13