如何将Realtime Database接入Heroku托管的Discord.js机器人
Heroku部署Discord.js机器人
firebase is not a module报错修复及Realtime Database对接流程 一、先修复模块找不到的核心问题
90%以上的该类报错都是依赖安装配置错误导致,不需要找特殊buildpack:
- 进入本地项目根目录,执行
npm install firebase --save安装Firebase官方SDK,禁止加-D参数:加了之后firebase会被写入开发依赖列表,Heroku生产环境默认不会安装devDependencies下的包,自然会报模块不存在。 - 安装完成后打开
package.json检查,确认firebase出现在dependencies字段下,而非devDependencies字段下。 - 登录Heroku控制台进入对应机器人应用,打开Settings tab下的Buildpacks板块,确认列表里仅保留官方
heroku/nodejsbuildpack,删除所有第三方添加的Firebase相关buildpack——这类第三方buildpack大多已经停止维护,会干扰正常的依赖安装流程。
二、Heroku环境变量配置
不要把Firebase配置硬编码在代码里,全部通过Config Vars注入:
- 打开Firebase控制台进入对应项目,进入项目设置页,在“你的应用”板块添加Web应用(如果之前没加过),注册时不需要勾选Firebase Hosting选项。
- 注册完成后拿到初始化代码段里的
firebaseConfig配置对象,把对象里的apiKey、authDomain、databaseURL、projectId、storageBucket、messagingSenderId、appId7个字段,逐个添加到Heroku Settings tab下的Config Vars中,键名和配置字段名完全一致。
注意:databaseURL是连接Realtime Database的必填字段,如果配置对象里没显示,直接去Realtime Database页面顶部复制完整的数据库地址填入即可,漏填该字段会直接导致数据库连接失败 - 确认Config Vars里的
NODE_ENV值为production,如果之前为了安装开发依赖修改过该值,务必改回默认值。
三、代码初始化正确写法
目前Firebase v9+版本为模块化SDK,网上很多老教程的旧版require写法会触发模块报错,直接用下面的写法替换原有Firebase初始化逻辑:
// 引入依赖 const { initializeApp } = require('firebase/app'); const { getDatabase, ref, set } = require('firebase/database'); // 从环境变量读取配置 const firebaseConfig = { apiKey: process.env.apiKey, authDomain: process.env.authDomain, databaseURL: process.env.databaseURL, projectId: process.env.projectId, storageBucket: process.env.storageBucket, messagingSenderId: process.env.messagingSenderId, appId: process.env.appId }; // 初始化服务 const firebaseApp = initializeApp(firebaseConfig); const db = getDatabase(firebaseApp); // 测试连接(验证完成后可删除) const testConRef = ref(db, 'connectTest'); set(testConRef, { connectAt: Date.now(), status: 'success' }) .then(() => console.log('Firebase Realtime Database 连接成功')) .catch(err => console.error('数据库连接异常:', err));
后续所有数据库操作都基于初始化好的db对象调用对应方法即可。
四、部署验证
- 本地先执行
node 你的机器人入口文件.js(一般是index.js/bot.js),确认本地启动无报错,控制台能打印数据库连接成功日志后,再把代码推送到Heroku部署。 - 部署完成后查看Heroku应用日志,如果依然报模块不存在,先执行
heroku restart -a 你的Heroku应用名重启服务;重启无效的话,通过Heroku控制台的Run console功能执行npm ls firebase,确认依赖是否正常安装,如果安装异常,删除本地的node_modules文件夹和package-lock.json文件,重新执行npm install提交后再部署。 - 测试阶段可以先把Firebase Realtime Database的规则临时调整为允许读写,确认连接通了之后再配置对应鉴权规则,避免规则拦截导致误判为配置错误:
{ "rules": { ".read": true, ".write": true } }
注意:上述规则仅用于连通性测试,正式上线必须配置严格的读写鉴权规则,避免数据库被未授权访问。
内容的提问来源于stack exchange,提问作者Klipsgoboom
相关产品推荐
相关产品推荐

