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

如何避免discord.js开发的Bot向已屏蔽它的用户发消息时崩溃?

解决Discord Bot因用户屏蔽导致崩溃的方案

1. 捕获单条消息发送的错误

当Bot尝试给用户发送消息时,直接处理可能出现的拒绝状态,核心是针对Discord API返回的50007错误码(对应无法发送消息到用户,通常是被屏蔽或用户关闭了DM)做处理:

  • 用Promise的.catch()处理:
// 假设targetUser是你要发送消息的用户对象
targetUser.send("消息内容")
  .catch(error => {
    if (error.code === 50007) {
      console.log(`用户 ${targetUser.tag} 已屏蔽Bot,无法发送消息`);
    } else {
      console.error("发送消息时出现未知错误:", error);
    }
  });
  • 配合async/await用try/catch处理:
async function sendToUser(user, content) {
  try {
    await user.send(content);
  } catch (error) {
    if (error.code === 50007) {
      console.log(`无法给 ${user.tag} 发消息:用户已屏蔽Bot`);
    } else {
      console.error("消息发送失败:", error);
    }
  }
}

// 调用示例
sendToUser(targetUser, "测试消息");

2. 全局兜底错误捕获

为了防止漏处理的错误导致Bot整体崩溃,给客户端添加全局错误监听:

const { Client } = require('discord.js');
const client = new Client({ intents: [/* 你的意图配置 */] });

// 监听客户端自身错误
client.on('error', error => {
  console.error("客户端错误:", error);
});

// 监听未处理的Promise拒绝
process.on('unhandledRejection', (reason) => {
  if (reason.code === 50007) {
    console.log("触发错误原因:用户已屏蔽Bot");
  } else {
    console.error("未处理的Promise拒绝:", reason);
  }
});

3. 提前验证消息发送权限(可选)

虽然Discord没有直接提供检查用户是否屏蔽Bot的接口,但可以通过尝试创建DM通道来提前验证:

async function canReceiveMessage(user) {
  try {
    await user.createDM();
    return true;
  } catch (error) {
    return error.code === 50007 ? false : false;
  }
}

// 使用示例
if (await canReceiveMessage(targetUser)) {
  await targetUser.send("你的消息内容");
} else {
  console.log(`${targetUser.tag} 无法接收Bot消息`);
}

核心逻辑是:只要针对50007错误做捕获处理,就能避免Bot因用户屏蔽而崩溃,同时可以根据需求记录日志或给触发指令的用户反馈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:24:58