Node.js同Firebase项目创建多实例时Admin SDK不可用如何解决
问题根因
你遇到的所有报错均来源于Admin SDK初始化的命名配置不匹配:
- 初始化Admin SDK时传入了第二个参数
'adminApp',创建的是名为adminApp的非默认实例 - 后续调用
admin.database()时,SDK默认读取[default]命名的实例,而你没有创建过默认的Admin实例,因此触发「no firebase app '[default]' has been created」错误 - 第一种
once写法无响应是因为实例读取失败,数据库请求未实际发出,回调不会触发 - 第二种写法的类型报错是因为
admin.database()返回了非预期的异常对象,后续链式调用的参数不符合类型要求
修复方案
方案1:保留命名实例(适合后续需要多Admin实例的场景)
调用Admin接口时指定你初始化的命名实例即可:
app.get("/api/test", (req, res) => { const uid = 'my-user-UID'; // 先获取你创建的adminApp命名实例 const adminInstance = admin.app('adminApp'); adminInstance.database().ref(`users/${uid}`) .once('value', (snapshot) => { if(snapshot) { console.log('data'); } else { console.log('no data'); } }); });
方案2:使用默认实例(同项目多SDK场景最优解,你验证可行的方案)
客户端JS SDK和Admin SDK是完全独立的两套依赖,内部实例存储互相隔离,各自的默认实例不会冲突,不需要给Admin SDK加自定义命名,直接初始化默认实例即可:
// 去掉第二个参数'adminApp' admin.initializeApp({ credential: applicationDefault(), databaseURL: 'my-database-url' }); // 客户端SDK初始化不受影响 const firebase = require("firebase/app"); firebase.initializeApp(my-config);
内容的提问来源于stack exchange,提问作者justchecking
相关产品推荐
相关产品推荐

