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

Discord.js slash command权限系统不生效 无法限制用户使用命令

问题根因

你给出的代码存在几个典型的Discord.js命令权限配置问题,是权限不生效的直接原因:

  1. 仅添加了指定角色的允许权限,没有禁用@everyone的默认使用权限,权限规则是只要有一条允许就生效,所以所有人都能访问
  2. 没有处理重复创建的旧命令:代码每次启动都会调用guild.commands.create创建新命令,服务器内会累积大量无权限限制的旧命令,用户实际调用的是旧命令
  3. 异步逻辑无等待:用map包裹的异步操作没有用Promise.all批量等待,大概率权限设置请求还没完成就中断,没实际生效
  4. 未做错误捕获:权限设置请求如果被Discord拒绝(比如bot缺少管理命令权限、API版本不兼容),你看不到任何报错,无法排查
  5. 若你使用的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:45:05