使用Firestore get()获取集合所有文档报错:get不是函数
解决AngularFirestore中“get is not a function”错误
看起来你是把原生Firebase SDK的集合方法和AngularFire的API搞混了——AngularFirestoreCollection 实例本身并没有 get() 方法,这就是你报错的核心原因。下面给你两种可行的解决方案,根据你的需求选择:
方案1:使用AngularFire推荐的响应式方式(实时监听集合)
AngularFire的设计核心是响应式,如果你需要实时同步集合数据,推荐用valueChanges()或snapshotChanges(),它们会返回Observable,配合模板里的async管道能自动处理订阅/取消订阅,还能避免内存泄漏:
export class MainComponent implements OnInit { selectedCharacter: number = null; people: Observable<Character[]>; // 明确类型为Character数组的Observable private peopleCollection: AngularFirestoreCollection<Character>; constructor(private db: AngularFirestore) { // 初始化集合引用,替换成你的实际集合名称 this.peopleCollection = this.db.collection<Character>('people'); } ngOnInit(): void { // 方式1:仅获取文档数据(无ID等元数据) this.people = this.peopleCollection.valueChanges(); // 方式2:获取文档数据+元数据(比如文档ID) this.people = this.peopleCollection.snapshotChanges().pipe( map(actions => actions.map(action => { const data = action.payload.doc.data() as Character; const id = action.payload.doc.id; return { id, ...data }; })) ); } }
然后在模板中使用async管道遍历数据:
<div *ngFor="let person of people | async"> {{ person.id }} - {{ person.name }} <!-- 替换成你的实体字段 --> </div>
方案2:单次获取集合数据(类似原生get()的一次性读取)
如果你不需要实时监听,只是想一次性获取集合所有文档,可以通过AngularFirestoreCollection的ref属性拿到原生Firebase的CollectionReference,再调用它的get()方法:
export class MainComponent implements OnInit { selectedCharacter: number = null; people: Character[] = []; // 用普通数组存储一次性获取的数据 private peopleCollection: AngularFirestoreCollection<Character>; constructor(private db: AngularFirestore) { this.peopleCollection = this.db.collection<Character>('people'); } async ngOnInit(): void { try { const querySnapshot = await this.peopleCollection.ref.get(); // 转换为包含文档ID的数组 this.people = querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() as Character })); console.log('集合数据:', this.people); } catch (error) { console.error('获取数据失败:', error); } } }
额外检查项
确保你已经正确导入了AngularFire相关模块到AppModule中:
import { AngularFireModule } from '@angular/fire/compat'; import { AngularFirestoreModule } from '@angular/fire/compat/firestore'; import { environment } from '../environments/environment'; @NgModule({ imports: [ AngularFireModule.initializeApp(environment.firebaseConfig), AngularFirestoreModule ] }) export class AppModule { }
总结一下:如果需要实时更新集合数据,优先用方案1的响应式Observable;如果只需要单次读取数据,用方案2调用原生的get()方法即可。
内容的提问来源于stack exchange,提问作者mwo
相关产品推荐
相关产品推荐

