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`) }) } }
错误截图:
现有代码仅校验了命令调用者的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
相关产品推荐
相关产品推荐

