AngularFire2 v6无监听器单次获取users集合单文档的实现问题
AngularFire v6中collection.get()方法返回的是Observable<QuerySnapshot>类型,不会持续监听数据变化,仅触发一次查询,你之前获取结果不符合预期是因为没有从返回的快照对象中提取实际的文档数据,正确实现如下:
方式1:直接订阅Observable
// 给查询加limit(1)优化,因为邮箱唯一只需返回1条结果 this.firestore.collection('users', ref => ref.where('email', '==', res.email).limit(1)) .get() .subscribe(querySnapshot => { if (querySnapshot.empty) { // 无匹配数据的兜底逻辑 return; } // 提取第一条文档的实际数据 this.item = querySnapshot.docs[0].data(); this.firstName = this.item.firstname; this.lastName = this.item.lastname; this.email = this.item.email; this.role = this.item.role; this.lead = !!this.item.lead; }, err => { // 可选:查询失败的错误处理逻辑 console.error('用户数据查询失败', err); });
方式2:Promise 写法
// 封装为异步方法调用 async loadUserInfo(email: string) { try { const querySnapshot = await this.firestore.collection('users', ref => ref.where('email', '==', email).limit(1) ).get().toPromise(); if (querySnapshot.empty) return; this.item = querySnapshot.docs[0].data(); // 后续字段赋值逻辑和上述一致 } catch (err) { console.error('用户数据查询失败', err); } }
注意事项
get()返回的查询快照本身不会自动解析文档数据,必须通过docs属性获取匹配的文档列表,再调用每个文档的data()方法拿到实际存储的字段内容- 如果需要获取文档ID,可以在赋值时拼接:
this.item = { id: querySnapshot.docs[0].id, ...querySnapshot.docs[0].data() } - 由于
get()仅触发一次返回结果,不需要额外取消订阅也不会造成内存泄漏,也可以搭配take(1)操作符进一步规范rxjs流处理
内容的提问来源于stack exchange,提问作者hego64
相关产品推荐
相关产品推荐

