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

Discord.js v13 报Missing Permissions错误 权限校验代码不生效问题排查

问题原因及修复方案

1. 核心逻辑错误

你当前的权限校验用了&&逻辑与运算符,只有同时满足全局无对应权限 + 当前频道也无对应权限时才会触发拦截,完全不符合预期。
举个例子:机器人全局有SEND_MESSAGES权限,但是当前触发命令的频道单独封禁了机器人的发送权限,此时!message.guild.me.permissions.has("SEND_MESSAGES")为false,整个判断条件不成立,不会触发拦截,代码直接执行后续发消息逻辑就会抛出权限不足错误。

另外message.channel.permissionsFor(message.guild.me)会自动合并服务器全局权限和频道的覆盖权限,不需要额外判断全局权限,直接用该方法的返回结果做校验即可。

2. 版本适配问题

如果你使用的是discord.js v14及以上版本,大写字符串格式的权限标识符已经废弃,需要引入PermissionFlagsBits枚举值使用,否则权限判断会直接失效。

3. 潜在场景遗漏

你当前的校验只覆盖了触发命令的频道,如果你的命令逻辑中存在向其他频道(比如日志频道、通知频道)发送消息/嵌入的逻辑,这些频道的权限没有被校验,也会触发对应报错。

修正后代码示例

// 如果你用的是discord.js v14+,先在文件顶部引入枚举
const { Client, PermissionFlagsBits } = require('discord.js');

client.on("messageCreate", async(message) => {
    // ...
    if(!message.guild || message.author.bot || !message.content.startsWith(prefix)) return;
    // ...
    
    /* 权限校验开始 */
    const channelPerms = message.channel.permissionsFor(message.guild.me);
    // v13及以下版本用字符串 "SEND_MESSAGES" / "EMBED_LINKS" 即可
    if (!channelPerms.has(PermissionFlagsBits.SendMessages)) {
        return message.member.send("我缺少`SEND_MESSAGES`权限").catch(console.error);
    }
    if (!channelPerms.has(PermissionFlagsBits.EmbedLinks)) {
        return message.member.send("我缺少`EMBED_LINKS`权限").catch(console.error);
    }
    if (!channelPerms.has(PermissionFlagsBits.ReadMessageHistory)) {
        return message.member.send("我缺少`READ_MESSAGE_HISTORY`权限").catch(console.error);
    }
    /* 权限校验结束 */
    // ...
    try{
       await command.run(client, message, args);
    } catch (e) {
       // 建议打印更详细的错误信息方便排查
       console.error(`命令执行出错,触发频道:${message.channel.id},错误内容:`, e);
    }
})

额外排查建议

  • 检查机器人的角色在服务器中的层级,要高于所有设置了权限拒绝的普通角色,否则频道权限覆盖会失效
  • 如果有跨频道发消息的逻辑,要额外对目标频道做独立的权限校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:12:02