discord.js v14机器人指定频道权限检查报错求助
解决discord.js v14检查机器人频道权限的TypeError问题
问题重现
原discord.js v13权限检查代码:
if(!interaction.guild.me.permissionsIn(channel).has("VIEW_CHANNEL"))
升级到v14后修改为:
if(!interaction.guild.members.me.permissionsIn(channel).has([PermissionsFlagsBits.ViewChannel, PermissionsFlagsBits.SendMessages]))
触发错误:
TypeError: Cannot read properties of undefined (reading 'id') at GuildMemberRoleManager.get cache [as cache] (C:\Users\sdamz\OneDrive\Desktop\dcbot v2\node_modules\discord.js\src\managers\GuildMemberRoleManager.js:37:101) ...
尝试if(!interaction.guild.members.me.permissions.has([PermissionsFlagsBits.ViewChannel, PermissionsFlagsBits.SendMessages]))仍报错。
错误原因
该错误是因为机器人自身的GuildMember对象未被缓存,v14中guild.members.me依赖成员缓存,若缓存中不存在该对象,就会触发读取undefined属性的报错。
解决方案
启用GuildMembers意图
创建Client实例时必须添加GuildMembers意图,否则无法获取成员缓存:const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, // 关键:添加此意图 // 按需添加其他意图(如GuildMessages等) ], });手动获取机器人成员对象
若启用意图后仍报错,直接通过fetch方法主动获取机器人的GuildMember对象,不依赖缓存:// 先获取机器人的成员实例 const botMember = await interaction.guild.members.fetch(client.user.id); // 检查目标频道的权限 if (!botMember.permissionsIn(channel).has([ PermissionsFlagsBits.ViewChannel, PermissionsFlagsBits.SendMessages ])) { // 权限不足的处理逻辑,比如发送提示 await interaction.reply('我在该频道没有查看和发送消息的权限!'); }也可以简化为单行:
if (!(await interaction.guild.members.fetch(client.user.id)).permissionsIn(channel).has([PermissionsFlagsBits.ViewChannel, PermissionsFlagsBits.SendMessages])) { // 处理逻辑 }修复代码拼写错误
注意到你最后一段代码中SendMessagesl多了一个字母l,虽然不是当前报错的原因,但会导致权限检查逻辑失效,需修正为SendMessages。
内容的提问来源于stack exchange,提问作者tryfyfu
相关产品推荐
相关产品推荐

