Node环境下Firebase调用getAuth报getProvider未定义但可访问数据库
问题根源
你错误混用了Firebase Admin SDK(服务端专属)和Firebase Web客户端SDK的API,两类SDK的实例、接口完全不兼容。
- 你通过
admin.initializeApp()创建的是Admin SDK的应用实例,仅能用于调用Admin SDK提供的各类接口 - 你导入的
getAuth来自firebase/auth包,属于Web客户端SDK的Auth模块,只能识别客户端SDK初始化生成的应用实例,完全不识别Admin SDK的实例,所以才会报找不到getProvider的错误。
两个报错的对应解释
- 传
firebaseApp参数时报Cannot read property 'getProvider' of undefined:
客户端SDK的getAuth方法接收的实例需要包含container属性,而Admin SDK返回的实例没有这个属性,内部读取属性失败抛出错误。 - 不传参数时报
No Firebase app '[DEFAULT'] has been created:
客户端SDK和Admin SDK的应用实例池是完全隔离的,你仅在Admin侧初始化了默认应用,客户端SDK的实例池里没有任何初始化的应用,自然找不到[DEFAULT]实例。
你删除Auth相关代码后数据库能正常运行,是因为数据库调用用的是Admin SDK实例自带的database()方法,属于Admin SDK的原生API,调用逻辑本身没有问题。
修复方案
直接使用Admin SDK自带的Auth能力即可,不要导入客户端SDK的getAuth:
import admin from 'firebase-admin'; // 删除原有 import {getAuth} from 'firebase/auth' 导入语句 class MyFirebase { constructor() { console.log("MyFirebase Constructor"); this.firebaseApp = admin.initializeApp({ credential: admin.credential.cert("PATH_TO_CERT/cert.json"), databaseURL: "https://DATABASE_URL", }); console.log("App name="+this.firebaseApp.name); // 改用Admin SDK提供的auth接口 this.defaultAuth = this.firebaseApp.auth(); this.database = this.firebaseApp.database(); // 后续数据库引用相关代码 } }
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

