使用discord.js v13与Node.js 16时检查服务器所有者权限报错:TypeError: Cannot read properties of undefined (reading 'has')
解决Discord.js v13中检查服务器所有者时的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: Cannot read properties of undefined (reading 'has')主要有两个原因,咱们一步步拆解:
错误根源
- 对象类型用错了:你通过
message.mentions.users.first()拿到的是User对象,但User并没有permissions属性——只有GuildMember(服务器成员)对象才包含服务器内的权限、角色这类专属信息。 - 没处理无提及的情况:如果用户没@任何人,
member会变成undefined,这时候去访问member.permissions自然会触发报错。
另外,你想判断对方是不是服务器所有者,靠检查MANAGE_GUILD权限并不准确——因为其他管理员也可能拥有这个权限,但他们不是所有者。直接对比成员ID和服务器所有者ID才是最靠谱的方式。
修正后的代码
// 获取提及的服务器成员(GuildMember),而非User对象 const member = message.mentions.members.first(); const reason = args.slice(1).join(' ') || 'No reason specified.'; // 先检查是否有提及目标成员 if (!member) { return message.reply('你需要提及一个成员才能执行这个操作哦!'); } // 直接对比成员ID与服务器所有者ID(Discord.js v13的写法) if (member.id === message.guild.ownerId) { return message.reply('我不能对服务器所有者进行 moderation 操作。'); }
关键说明
- 使用
message.mentions.members.first()获取GuildMember实例,它包含了成员在当前服务器的所有相关数据,包括权限信息。 - 先判断
member是否存在,避免因未提及成员导致的undefined报错。 message.guild.ownerId是Discord.js v13中获取服务器所有者ID的属性,直接对比ID是判断所有者最准确的方法,比权限检查更可靠。
内容的提问来源于stack exchange,提问作者Pooyan
相关产品推荐
相关产品推荐

