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

discord.js v13开发addrole命令报Missing Access错误如何解决

discord.js v13 添加角色命令报Missing Access错误修复

问题现象

基于discord.js v13开发成员加角色命令时,运行后控制台抛出Missing Access错误,现有实现逻辑如下:

const { MessageEmbed } = require("discord.js");
const Discord = require("discord.js")
const config = require("../../botconfig/config.json");
const ee = require("../../botconfig/embed.json");
const settings = require("../../botconfig/settings.json");

module.exports = {
  name: "addrole",
  category: "Utility",
  permissions: ["MANAGE_ROLES"],
  aliases: ["stl"],
  cooldown: 5,
  usage: "addrole <user> <role>",
  description: "Add a role to a member",

  run: async (client, message, args, plusArgs, cmdUser, text, prefix) => {
    /**
     * @param {Message} message
    */
    if (!message.member.permissions.has("MANAGE_ROLES")) return message.channel.send("<a:mark_rejected:975425274487398480> **You are not allowed to use this command. You need `Manage Roles` permission to use the command.**")

    const target = message.mentions.members.first();
    if (!target) return message.channel.send(`<a:mark_rejected:975425274487398480> No member specified`);
    const role = message.mentions.roles.first();
    if (!role) return message.channel.send(`<a:mark_rejected:975425274487398480> No role specified`);

    await target.roles.add(role)
    message.channel.send(`<a:mark_accept:975425276521644102> ${target.user.username} has obtined a role`).catch(err => {
      message.channel.send(`<a:mark_rejected:975425274487398480> I do not have access to this role`)
    })
  }
}

错误截图:
Missing Access控制台报错截图
现有代码仅校验了命令调用者的MANAGE_ROLES权限,执行target.roles.add()操作时直接触发无权限报错,无法完成角色添加。

报错根因

Discord角色权限体系有两个硬性规则,现有代码完全未覆盖:

  • 执行角色操作的主体(即机器人自身)必须拥有MANAGE_ROLES权限,仅校验调用者权限不生效
  • 机器人账号在服务器内的最高角色位阶,必须高于要操作的目标角色位阶,否则无权分配、修改该角色
    另外现有代码的错误捕获只绑定在了成功消息的发送操作上,没有捕获target.roles.add()本身抛出的异常,导致错误直接打印到控制台。

修复方案

1. 服务器端权限配置

  • 进入服务器设置-角色列表,找到机器人绑定的角色
  • 给该角色勾选「管理角色」权限
  • 将机器人的角色拖动到所有需要通过命令分配的自定义角色上方,保存设置(Discord规定只能操作位阶低于自身最高角色的其他角色)

2. 代码补全校验与错误捕获

修改后的可运行代码如下:

const { MessageEmbed } = require("discord.js");
const Discord = require("discord.js")
const config = require("../../botconfig/config.json");
const ee = require("../../botconfig/embed.json");
const settings = require("../../botconfig/settings.json");

module.exports = {
  name: "addrole",
  category: "Utility",
  permissions: ["MANAGE_ROLES"],
  aliases: ["stl"],
  cooldown: 5,
  usage: "addrole <user> <role>",
  description: "Add a role to a member",

  run: async (client, message, args, plusArgs, cmdUser, text, prefix) => {
    // 校验调用者权限
    if (!message.member.permissions.has("MANAGE_ROLES")) return message.channel.send("<a:mark_rejected:975425274487398480> **你没有使用该命令的权限,需要拥有「管理角色」权限才可操作**")
    // 校验机器人自身基础权限
    if (!message.guild.me.permissions.has("MANAGE_ROLES")) return message.channel.send("<a:mark_rejected:975425274487398480> **我缺少管理角色权限,请先给我开通对应权限**")

    const target = message.mentions.members.first();
    if (!target) return message.channel.send(`<a:mark_rejected:975425274487398480> 未指定目标成员`);
    const role = message.mentions.roles.first();
    if (!role) return message.channel.send(`<a:mark_rejected:975425274487398480> 未指定要添加的角色`);

    // 校验角色位阶
    if (message.guild.me.roles.highest.position <= role.position) return message.channel.send(`<a:mark_rejected:975425274487398480> 我的角色位阶低于目标角色,无权分配该角色,请将我的角色移动到目标角色上方`)
    // 校验目标成员位阶,避免修改管理员等高阶成员角色时报错
    if (message.guild.me.roles.highest.position <= target.roles.highest.position) return message.channel.send(`<a:mark_rejected:975425274487398480> 我的角色位阶低于目标成员,无权修改该成员的角色`)

    // 给角色添加操作加错误捕获
    try {
      await target.roles.add(role)
      message.channel.send(`<a:mark_accept:975425276521644102> 已成功给 ${target.user.username} 添加对应角色`)
    } catch (err) {
      console.error(err)
      message.channel.send(`<a:mark_rejected:975425274487398480> 添加角色失败,请检查权限配置`)
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:54:29