DISCORD.JS V13 校验成员权限报TypeError: Cannot read property 'has' of undefined 求助
问题排查与修复方案
报错触发原因
- 核心错误是你调用
permissions.has()的对象类型不符合要求:你通过message.mentions.users.first()获取的是Discord的User(全局用户)对象,该对象仅存储用户全局公共属性(如用户名、头像、用户标签),不存在服务器权限相关的permissions属性,因此读取permissions会返回undefined,调用has方法时自然抛出类型错误。 - 权限属性是GuildMember(服务器成员)对象独有的,只有归属对应服务器的成员实例才会携带权限字段。
修复方案
- 将获取提及对象的API从
message.mentions.users.first()改为message.mentions.members.first(),直接获取服务器成员对象 - 增加边界判断,避免用户未@任何人时出现新的报错
- 修正
reply方法的content参数格式,该参数接收字符串而非数组
修复后的完整代码如下:
const { Client, Message } = require("discord.js"); module.exports = { name: "user", description: "comando a risposta", aliases: ["boop", "test"], /** * @param {Client} client * @param {Message} message * @param {String[]} args */ run: async (client, message, args) => { // 改为获取服务器成员对象,而非全局用户对象 const member = message.mentions.members.first(); // 边界判断:未@任何成员时直接返回提示 if(!member) return message.reply({content: "请先@一位服务器成员"}); if(member.permissions.has("ADMINISTRATOR")) return message.reply({content: "he has the admin"}); message.reply(`${member.user.tag}`) } }
补充注意事项
- 确保机器人已经开启了
Guilds、GuildMembers相关的网关意图,否则可能无法正常获取成员对象 - 如果你使用的是discord.js v14及以上版本,权限枚举值需要改为
PermissionFlagsBits.Administrator,注意提前导入对应的枚举类
内容的提问来源于stack exchange,提问作者ftc404
相关产品推荐
相关产品推荐

