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

求助:如何阻止Discord.js机器人因错误自动终止运行?

解决Discord.js机器人遇到错误就崩溃的问题

嘿,我来帮你搞定这个机器人崩溃的麻烦!你之前用client.on("error")尝试重启没用,是因为这个事件只能捕获客户端层面的少数低级错误,而你遇到的这些都是代码里的未捕获异常或者Promise拒绝,根本没被这个监听器覆盖到。咱一步步来解决:

一、先给机器人加全局错误兜底,避免直接崩溃

先加上两个全局事件监听器,把所有漏网的错误都接住,至少不会让机器人直接挂掉:

// 捕获同步代码里的未处理异常
process.on('uncaughtException', (err) => {
  console.error('⚠️ 未捕获的同步异常:', err.stack);
  // 如果你确实需要自动重启,可以在这里调用登录,但建议先查根源再操作
  // client.login(config.token);
});

// 捕获异步Promise里的未处理拒绝
process.on('unhandledRejection', (reason, promise) => {
  console.error('⚠️ 未处理的Promise拒绝:', reason.stack);
  console.error('关联的Promise:', promise);
});

这俩监听器能帮你把错误都记录下来,同时阻止机器人直接终止运行。

二、针对你遇到的具体错误逐个修复

1. TypeError: Cannot read property 'id' of null

这个错误是在创建DM的时候触发的,看调用栈是User.createDM()出了问题——大概率是你尝试创建DM的user对象是null或者不存在。你得去index.js第663行的异步代码里,先检查用户是否有效:

// 举个例子,假设你是通过ID获取用户
const userId = 'xxx';
const user = client.users.cache.get(userId);

// 先判断用户是否存在再操作
if (!user) {
  console.error('❌ 找不到目标用户,无法创建DM');
  return;
}

try {
  const dmChannel = await user.createDM();
  // 这里写创建DM后的逻辑
} catch (err) {
  console.error('❌ 创建DM失败:', err);
}

2. TypeError: Cannot read property 'setActivity' of null

这个是因为你调用client.user.setActivity()的时候,client.user还是null——要么是机器人还没完成登录就执行了这段代码,要么是登录失败了。正确的做法是把设置状态的代码放在ready事件里:

client.on('ready', () => {
  console.log(`✅ 已登录为 ${client.user.tag}`);
  // 设置机器人状态,用catch接住可能的错误
  client.user.setActivity('正在维护太空网络 🚀')
    .catch(err => console.error('❌ 设置状态失败:', err));
});

三、长期建议:不要靠重启掩盖问题

自动重启只能临时救急,真正靠谱的是把每个可能出错的地方都加上错误处理:

  • 所有用await的异步代码都套上try/catch
  • 对可能为null/undefined的变量做前置检查(也可以用ES6的可选链?.简化,比如user?.createDM())
  • 好好记录错误日志,方便定位问题根源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:12:43