Discord bot本地运行正常,部署Heroku时报SlashCommand无法实例化错误
问题原因
- 核心是
slash-create依赖的版本兼容性问题:你本地使用的是旧版slash-create,支持直接实例化SlashCommand基类创建命令;Heroku部署时拉取了v5及以上的新版本,该版本禁止直接实例化基类,要求必须通过继承的方式定义命令。 - 大部分情况是因为你的项目没有锁死依赖版本,
package.json中对slash-create的版本声明使用了^/~这类允许跨小版本/大版本升级的标识,导致Heroku安装了不兼容的版本。
修复方案
方案1:锁定依赖版本(无需修改业务代码,最快解决)
- 在本地项目根目录执行
npm list slash-create,查看本地安装的可用版本号,例如输出为4.10.0。 - 打开
package.json,将slash-create的版本声明修改为固定版本,比如"slash-create": "4.10.0",删除版本号前的^或~符号。 - 重新执行
npm install生成新的package-lock.json文件,将修改后的package.json和package-lock.json推送到Heroku重新部署即可。
方案2:适配新版slash-create(推荐,可使用新版功能)
修改报错指向的commands/back.js文件,将直接实例化的写法改为继承基类的写法:
旧版写法示例
const { SlashCommand } = require('slash-create'); module.exports = new SlashCommand({ name: 'back', description: '返回上一级' }, async (ctx) => { // 你的命令执行逻辑 });
新版兼容写法示例
const { SlashCommand } = require('slash-create'); module.exports = class BackCommand extends SlashCommand { constructor(creator) { super(creator, { name: 'back', description: '返回上一级' }); } async run(ctx) { // 你的命令执行逻辑 } }
所有命令文件都按上述规则修改后,重新提交代码部署即可。
内容的提问来源于stack exchange,提问作者Hrocha
相关产品推荐
相关产品推荐

