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

Discord分类内创建带特定权限文本频道遇权限修改失败

解决思路及修正方案

核心问题在于你使用了错误的权限方法名称,且未匹配Discord.js对应版本的API规范。以下是针对性的解决步骤:

1. 确认Discord.js版本

不同版本的Discord.js权限操作API差异很大:

  • v12及更早版本:使用updateOverwrite/overwritePermissions
  • v13/v14版本:权限覆盖操作统一移至channel.permissionOverwrites对象下

2. 正确的权限设置方法

针对v14版本(当前主流稳定版)

使用permissionOverwrites.set()批量设置权限覆盖,同时注意权限需使用PermissionsBitField.Flags常量(不能直接传字符串):

const { PermissionsBitField } = require('discord.js');

guild.channels.create({
    name: "》《🆔》" + user.user.username,
    type: 0,
    parent: "1067910662644314153" // 直接在创建时指定父分类,无需额外调用setParent
})
.then(channel => {
    // 批量设置权限覆盖
    channel.permissionOverwrites.set([
        // 允许被提及用户访问
        {
            id: user.user.id,
            allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages]
        },
        // 允许命令调用者访问
        {
            id: author.id,
            allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages]
        },
        // 拒绝所有普通成员访问(继承分类权限后,需要显式拒绝)
        {
            id: guild.roles.everyone,
            deny: [PermissionsBitField.Flags.ViewChannel]
        }
    ]);
});

针对v13版本

逻辑与v14类似,仅权限常量为Permissions.FLAGS:

const { Permissions } = require('discord.js');

guild.channels.create({
    name: "》《🆔》" + user.user.username,
    type: 'GUILD_TEXT', // v13中type需用字符串枚举
    parent: "1067910662644314153"
})
.then(channel => {
    channel.permissionOverwrites.set([
        {
            id: user.user.id,
            allow: [Permissions.FLAGS.VIEW_CHANNEL, Permissions.FLAGS.SEND_MESSAGES]
        },
        {
            id: author.id,
            allow: [Permissions.FLAGS.VIEW_CHANNEL, Permissions.FLAGS.SEND_MESSAGES]
        },
        {
            id: guild.roles.everyone,
            deny: [Permissions.FLAGS.VIEW_CHANNEL]
        }
    ]);
});

针对v12及更早版本

使用overwritePermissions方法:

guild.channels.create("》《🆔》" + user.user.username, {
    type: 'text',
    parent: "1067910662644314153"
})
.then(channel => {
    channel.overwritePermissions([
        {
            id: user.user.id,
            allow: ['VIEW_CHANNEL', 'SEND_MESSAGES']
        },
        {
            id: author.id,
            allow: ['VIEW_CHANNEL', 'SEND_MESSAGES']
        },
        {
            id: guild.roles.everyone,
            deny: ['VIEW_CHANNEL']
        }
    ]);
});

3. 关键注意点

  • 必须显式拒绝@everyone的VIEW_CHANNEL权限,否则服务器所有成员都能看到该频道(因为分类权限可能默认允许访问)
  • 服务器管理员默认拥有所有频道权限,无需额外设置
  • 创建频道时直接指定parent参数,比后续调用setParent更高效

内容的提问来源于stack exchange,提问作者JAWS Developers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:40:58