You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:06:25