Discord.js v14检查@everyone频道权限触发TypeError报错求助
问题描述
我需要检查@everyone角色在指定频道中是否拥有特定权限,Discord.js v13中的代码可以正常运行:
const channelPermissions = channel.guild.roles.everyone.permissionsIn(channel); if (channelPermissions.has([Permissions.FLAGS.SEND_MESSAGES, Permissions.FLAGS.VIEW_CHANNEL])) { interaction.reply('Hey! You can use this channel!'); }
在v14版本中,我按照权限位的变更修改了代码,但执行时触发错误:
const { PermissionsBitField } = require('discord.js'); const channelPermissions = interaction.channel.guild.roles.everyone.permissionsIn(channel); if (channelPermissions.has([PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel])) { interaction.reply('Hey! You can use this channel!'); }
错误信息:
TypeError: Cannot read properties of null (reading 'has')
官方文档未提及permissionsIn方法有破坏性变更,不清楚错误来源,寻求帮助。
错误原因
Discord.js v14中已移除Role.permissionsIn()方法,调用该方法会返回null,因此后续调用has()时会触发“无法读取null的has属性”错误。虽然官方文档可能未明确标注这个变更,但这是v14对权限相关API的调整之一。
解决方法
在v14中,需使用Channel.permissionsFor()方法来获取角色在指定频道的权限,替代原有的permissionsIn()。修改后的代码如下:
const { PermissionsBitField } = require('discord.js'); // 获取@everyone角色在目标频道的权限 const channelPermissions = channel.permissionsFor(channel.guild.roles.everyone); // 检查是否同时拥有指定权限 if (channelPermissions?.has([PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel])) { interaction.reply('Hey! You can use this channel!'); }
- 使用
channel.permissionsFor(角色对象)获取权限集合 - 添加可选链操作符
?.避免因权限对象获取失败导致的报错(增强代码健壮性) - 权限位使用
PermissionsBitField.Flags下的枚举值,符合v14的规范
内容的提问来源于stack exchange,提问作者Sebastián Camargo Marín
相关产品推荐
相关产品推荐

