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); } }
问题分析与修复
核心错误点
- 成员对象拼写错误:
message.members是服务器成员集合,单个消息发送者的成员对象应为message.member(单数),直接访问message.members会返回undefined,导致后续读取permission属性报错。 - 权限属性拼写错误:Discord.js v14中,成员的权限属性是
permissions(复数),而非permission。 - 权限枚举导入与使用问题:如果
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.
相关产品推荐
相关产品推荐

