如何避免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
相关产品推荐
相关产品推荐

