部署于Heroku的Discord bot出现UnhandledPromiseRejectionWarning报错咨询
错误根因
核心错误为ReferenceError: AbortController is not defined,触发原因如下:
- 你使用的discord.js版本为v13及以上,该版本依赖仅在Node.js v16.6.0及更高版本才原生支持的
AbortControllerAPI - Heroku默认使用的Node.js版本低于v16.6.0,无法识别该API,进而触发未捕获的Promise拒绝报错,最终进程崩溃。
解决方案
推荐优先用版本匹配方案从根本解决问题:
- 第一步:在项目根目录的
package.json文件中新增engines字段,明确指定符合要求的Node.js版本,示例配置如下:
{ "name": "your-discord-bot", "version": "1.0.0", "engines": { "node": "16.x" } }
配置完成后Heroku构建时会自动拉取v16最新版的Node.js运行环境。
- 第二步:在bot登录逻辑处添加错误捕获,方便后续排查问题,示例代码如下:
// 替换你原有client.login的逻辑 client.login('你的bot token') .catch(err => console.error('Bot登录失败,错误信息:', err))
- 第三步:提交修改后的代码到Heroku重新构建部署即可。
如果暂时无法升级Node.js版本,可使用临时兼容方案:
运行npm install abort-controller安装兼容包,然后在bot入口文件(./src/bot.js)最顶部添加如下代码补全全局API:
// CommonJS 环境使用以下代码 global.AbortController = require('abort-controller'); // ESModule 环境使用以下代码 import AbortController from 'abort-controller'; global.AbortController = AbortController;
内容的提问来源于stack exchange,提问作者Tanishq SIngh Anand
相关产品推荐
相关产品推荐

