You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:35:39