Discord.js v14设置命令权限遇OAuth2 Bearer Token缺失错误求解决
解决Discord.js v14设置命令权限时的Bearer Token错误
出现Editing application command permissions requires an OAuth2 bearer token, but none was provided错误的核心原因是:Discord.js v14中修改应用命令权限需要通过官方REST API传递机器人令牌(作为Bearer Token),你当前使用的commands.permissions.set()方法未正确处理令牌注入,或调用方式不符合v14的要求。
以下是两种可行的解决方案:
方案一:使用REST API直接请求(官方推荐)
这是最可靠的方式,直接调用Discord的REST接口来设置权限:
- 导入Discord.js的REST模块和路由:
const { REST, Routes } = require('discord.js');
- 初始化REST实例并传入机器人令牌:
const rest = new REST({ version: '10' }).setToken('你的机器人令牌');
- 构造权限数据并发送请求:
// 注意:v14中type需要用数值,USER=2,ROLE=1,不要用字符串 const fullPermissions = [ { id: "目标命令ID", permissions: [{ id: "目标用户/角色ID", type: 2, permission: false }] } ]; try { // 替换占位符:服务器ID、机器人应用ID(开发者门户里获取) await rest.put( Routes.guildApplicationCommandPermissions('服务器ID', '机器人应用ID'), { body: { fullPermissions } } ); console.log('命令权限已成功更新'); } catch (err) { console.error('设置权限失败:', err); }
如果仅需修改单条命令的权限,可使用这条路由:
Routes.guildApplicationCommandPermission('服务器ID', '机器人应用ID', '单条命令ID')
此时body直接传{ permissions: [...] }即可,无需外层的fullPermissions数组。
方案二:修正客户端调用方式(需确保令牌配置正确)
若坚持使用客户端对象调用,需确保客户端初始化时已正确传入令牌,且调用时明确指定应用ID:
const guild = client.guilds.cache.get('服务器ID'); await guild.commands.permissions.set({ fullPermissions, // 必须传入机器人的应用ID applicationId: '你的机器人应用ID' });
不过这种方式仍可能因环境或版本问题出现令牌传递异常,因此更推荐方案一。
关键注意事项
- 机器人令牌和应用ID必须正确,可在Discord开发者门户的机器人页面获取。
type参数必须用数值:USER对应2,ROLE对应1,v14不再支持字符串类型的type值。- 确保机器人拥有
ManageGuild或相关权限,否则会返回权限不足错误。
内容的提问来源于stack exchange,提问作者Yulius
相关产品推荐
相关产品推荐

