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

discord.js机器人向无发信权限频道发消息后崩溃如何修复

问题根因

你遇到的崩溃是由于调用channel.send()方法时,机器人缺少对应频道的发送消息权限,且该异步方法抛出的错误没有被捕获,直接导致Node.js进程终止。

注意:你使用的discord.js v13版本中,message事件已被废弃,建议替换为messageCreate事件,避免消息无法正常触发的问题。

修复方案

两种方案可以搭配使用,兜底保证不会崩溃:

方案1:发送消息前先校验权限

在执行发送逻辑前,先判断机器人在当前频道的权限,无权限直接终止操作:

client.on('messageCreate', msg => {
  // 跳过机器人自身发送的消息,避免死循环
  if (msg.author.bot) return;
  if (msg.content === 'floppa') {
    // 仅在服务器频道校验权限,私信频道无需校验
    if (msg.guild) {
      const hasSendPerm = msg.guild.me.permissionsIn(msg.channel).has(Permissions.FLAGS.SEND_MESSAGES);
      if (!hasSendPerm) return;
    }
    const imageNumber = files[Math.floor(Math.random()*files.length)];
    msg.channel.send({files: ["./floppa/" + imageNumber]});
  }
});

方案2:捕获发送操作的异步错误

channel.send()返回Promise对象,添加catch捕获错误即可避免进程崩溃,即使出现权限不足或其他发送失败问题,只会打印日志不会终止运行:

msg.channel.send({files: ["./floppa/" + imageNumber]})
  .catch(err => {
    console.error(`频道 ${msg.channel.id} 发送消息失败:`, err.message);
  });
额外全局稳定性优化

可以添加全局未捕获Promise错误监听,兜底处理所有未捕获的异步错误,避免其他未知场景导致崩溃:

// 放在代码入口位置即可
process.on('unhandledRejection', (err) => {
  console.error('未处理的异步错误:', err);
});

内容的提问来源于stack exchange,提问作者Mocar 2D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:30:03