Discord.js部署至Heroku时抛出embed author name类型异常
问题根因
这个报错的核心诱因是Heroku环境实际运行的discord.js版本与本地不一致,v12及更早版本的MessageEmbed.setAuthor() 方法不支持对象格式传参。
你判断版本一致的结论存在偏差,通常是两个环节疏漏导致的:
- 本地node_modules存在版本缓存,实际运行的是支持对象传参的v13/v14版本,但package.json中声明的discord.js版本范围(带
^前缀的松散版本声明)可以匹配到v12最终稳定版,Heroku全新拉取依赖时就会安装v12版本 - 没有将本地的依赖锁定文件(
package-lock.json/yarn.lock)提交到Git仓库,Heroku安装依赖时不会对齐你本地的精确依赖版本,只会拉取符合package.json版本范围的包
你之前两次排查没有解决问题,是因为排查方向完全错了:
- 你只修改了传入对象内部的name字段为固定字符串,但传给setAuthor的第一个参数整体还是对象类型,v12版本的setAuthor会直接把第一个入参当成name值做类型校验,对象不是字符串,必然报错
- 你给对象内的name字段调用
toString()强转,也没有改变第一个入参是对象的事实,类型校验在读取入参的第一时间就会触发,根本不会解析对象内部的属性
验证方法
在本地终端执行以下命令,查看Heroku环境实际安装的discord.js版本:
heroku run npm list discord.js
如果输出的版本号为12.x.x,即可完全确认问题根因。
修复方案
两种方案选其一即可:
- 方案1(兼容性最好,推荐):适配位置传参格式,修改setAuthor的调用方式,改完的代码在v12/v13/v14版本discord.js下都能正常运行:
const error_embed = new Discord.MessageEmbed() .setColor('#c00be0') .setTitle("To use this command please mention a user") // 传参顺序:name, iconURL, 跳转链接(无需求可省略) .setAuthor(msg.author.tag + ' ', msg.author.avatarURL())
- 方案2:锁定依赖版本和本地完全一致。将package.json中discord.js的版本号前的
^、~等松散版本符号删除,写死精确版本号(和你本地运行的版本一致),同时将本地生成的package-lock.json提交到Git仓库,重新部署即可。如果之前开了Heroku依赖缓存,可以先执行heroku config:set NODE_MODULES_CACHE=false关闭缓存,避免旧版本依赖残留。
内容的提问来源于stack exchange,提问作者Furious
相关产品推荐
相关产品推荐

