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

Discord.js v14机器人频道发消息权限校验问题排查

Discord机器人权限校验失效导致崩溃问题

我已经花了好几天尝试解决这个问题,一直没找到可行方案。我的Discord机器人不仅没返回预期结果,反而直接崩溃了。

我使用的权限校验及相关代码:

if (message.guild.members.me.permissions.has(PermissionsBitField.Flags.SendMessages)) {
    try {
        if (message.content.toLowerCase().startsWith(prefix) && !Icommand){
            message.channel.send(`Use b.help in the commands channel.`);
        }

        if (!Icommand) return;

        try {
            Icommand.execute(message, args, mention, client, PermissionsBitField);
        }
        catch (error) {
            console.error(error);
            message.reply('This command could not be run! The Dev has been notified.');
            
        }
    }
    catch (error) {
        console.log(error);
        return
    }
} else return

报错信息:

/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:350
      throw new DiscordAPIError(data, res.status, request);
            ^

DiscordAPIError: Missing Permissions
    at RequestHandler.execute (/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:350:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async RequestHandler.push (/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:51:14)
    at async TextChannel.send (/home/pi/british-bot/node_modules/discord.js/src/structures/interfaces/TextBasedChannel.js:175:15) {
  method: 'post',
  path: '/channels/1001430667416064050/messages',
  code: 50013,
  httpStatus: 403,
  requestData: {
    json: {
      content: 'Pong.',
      tts: false,
      nonce: undefined,
      embeds: undefined,
      components: undefined,
      username: undefined,
      avatar_url: undefined,
      allowed_mentions: undefined,
      flags: 0,
      message_reference: { message_id: '1017162983622848512', fail_if_not_exists: true },
      attachments: undefined,
      sticker_ids: undefined
    },
    files: []
  }
}

问题原因及解决方法:

  • 核心问题:当前代码只校验了机器人在服务器层面的发送消息权限,但没校验机器人在当前频道的发送权限。即便服务器层面有权限,单个频道的权限设置仍可能限制机器人发送消息,导致API调用失败抛出错误。
  • 修复步骤:
    1. 替换服务器层面的权限校验为频道层面校验:
      // 替换原有的 guild 权限校验为频道权限校验
      if (message.channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.SendMessages)) {
          // 后续逻辑保持不变
      } else return
      
    2. 处理命令报错中的二次权限问题:原代码里的message.reply也可能因权限问题触发错误,建议先校验权限再发送:
      catch (error) {
          console.error(error);
          if (message.channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.SendMessages)) {
              message.reply('This command could not be run! The Dev has been notified.');
          }
      }
      
    3. 增加全局错误捕获:避免单个未处理的错误导致整个机器人崩溃:
      process.on('unhandledRejection', error => {
          console.error('未处理的Promise拒绝:', error);
      });
      

内容的提问来源于stack exchange,提问作者rhys jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:27:09