Discord.js slash command权限系统不生效 无法限制用户使用命令
问题根因
你给出的代码存在几个典型的Discord.js命令权限配置问题,是权限不生效的直接原因:
- 仅添加了指定角色的允许权限,没有禁用
@everyone的默认使用权限,权限规则是只要有一条允许就生效,所以所有人都能访问 - 没有处理重复创建的旧命令:代码每次启动都会调用
guild.commands.create创建新命令,服务器内会累积大量无权限限制的旧命令,用户实际调用的是旧命令 - 异步逻辑无等待:用map包裹的异步操作没有用
Promise.all批量等待,大概率权限设置请求还没完成就中断,没实际生效 - 未做错误捕获:权限设置请求如果被Discord拒绝(比如bot缺少管理命令权限、API版本不兼容),你看不到任何报错,无法排查
- 若你使用的是Discord.js v14+版本,
command.permissions.add方法已被废弃,API调整后旧方法不生效
修复步骤
- 第一步:先清空服务器内已有的重复旧命令,执行一次以下逻辑即可:
// 一次性清空所有 guild 命令,避免残留 await guild.commands.set([]);
后续创建命令前建议先拉取已有命令列表,存在的话就调用edit修改,不要每次都create新的。
- 第二步:调整权限规则,添加
@everyone的禁用配置,修改你代码里的权限部分:
const permissions = [ // 先禁用所有人使用权限 { id: guild.id, permission: false, type: "ROLE" }, // 再加允许的角色权限 file.permission == "admin" ? { id: config_json_1.default.adminRole, permission: true, type: "ROLE" } : { id: config_json_1.default.freelancerRole, permission: true, type: "ROLE" } ]; // 若用v14+版本,替换为下方set方法,v13及以下可以用原add方法 await guild.commands.permissions.set({ command: command.id, permissions: permissions });
- 第三步:修复异步等待逻辑,确保所有操作执行完成,把代码中的
commandFiles.map改为:
yield Promise.all(commandFiles.map(value => { // 原有逻辑保持不变 }))
- 第四步:给异步逻辑添加错误捕获,打印可能的报错:
在权限设置的代码外层包裹try/catch,输出错误信息,确认bot在服务器内拥有管理命令权限,Discord开发者后台的bot设置里已开启相关权限开关。
内容的提问来源于stack exchange,提问作者foodSK
相关产品推荐
相关产品推荐

