如何通过Angular Fire获取非默认Firestore数据库的有效实例?
解决Angular 15 + Angular Fire 7.5获取非默认Firestore实例的问题
问题分析
你的代码存在两个核心问题:
- 混用了Angular Fire的
compat旧API与新API,导致实例获取逻辑混乱 initializeFirestore的调用参数错误,且未正确提取Firestore JS SDK的原生实例(你打印的是Angular Fire的包装对象,仅包含app、toJSON、type属性)
正确实现方案
针对Angular Fire 7.5版本,结合官方文档思路,推荐以下可靠实现:
1. 正确初始化非默认Firestore实例
从@angular/fire/firestore导入initializeFirestore和getFirestore,通过配置项指定databaseId:
import { FirebaseApp } from '@angular/fire/app'; import { initializeFirestore, Firestore } from '@angular/fire/firestore'; export class AppModule { private secondFirestore: Firestore; constructor(private firebaseApp: FirebaseApp) { // 初始化非默认数据库实例 this.secondFirestore = initializeFirestore(firebaseApp, {}, { databaseId: '你的非默认数据库ID' }); // 验证原生实例 console.log('原生Firestore实例:', this.secondFirestore); } }
2. 通过服务提供可注入的非默认实例
为了在组件中复用实例,创建服务封装非默认Firestore实例:
import { Injectable, Inject } from '@angular/core'; import { FirebaseApp } from '@angular/fire/app'; import { initializeFirestore, Firestore } from '@angular/fire/firestore'; @Injectable({ providedIn: 'root' }) export class SecondFirestoreService { public readonly firestore: Firestore; constructor(@Inject(FirebaseApp) app: FirebaseApp) { this.firestore = initializeFirestore(app, {}, { databaseId: '你的非默认数据库ID' }); } }
组件中调用示例:
import { Component } from '@angular/core'; import { SecondFirestoreService } from './second-firestore.service'; import { collection, getDocs } from '@angular/fire/firestore'; @Component({ selector: 'app-root', template: `<h1>非默认数据库测试</h1>` }) export class AppComponent { constructor(private secondFirestoreService: SecondFirestoreService) { // 使用原生API操作非默认数据库 const coll = collection(this.secondFirestoreService.firestore, 'test-collection'); getDocs(coll).then(snap => { console.log('文档数据:', snap.docs.map(doc => doc.data())); }); } }
3. 修复firestoreInstance$的使用方式
若坚持使用firestoreInstance$,需过滤目标实例并通过native属性获取原生Firestore实例:
import { firestoreInstance$ } from '@angular/fire/firestore'; import { filter, take } from 'rxjs/operators'; // 初始化实例后订阅 firestoreInstance$.pipe( filter(instance => instance.databaseId === '你的非默认数据库ID'), take(1) ).subscribe(angularFirestoreInstance => { const nativeFirestore = angularFirestoreInstance.native; // 拿到可用的原生实例 console.log('可用的Firestore实例:', nativeFirestore); });
关键注意事项
- Angular Fire 7.5对应Firebase JS SDK v9,需遵循v9模块化API规范
- 严格避免混用
compat旧API与新API,否则会导致实例不兼容 - 初始化时
databaseId必须精确匹配Firebase控制台中创建的数据库ID
内容的提问来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

