使用AngularFire从Firebase获取用户数据失败求助
解决AngularFire获取Firebase数据返回Observable而非实际内容的问题
你遇到的核心问题是AngularFire返回的是RxJS Observable对象,而非直接的数据——控制台输出的FirebaseListObservable就是这个可观察对象的实例,直接打印它当然看不到实际的用户数据。下面我一步步帮你解决这个问题:
1. 为什么会出现这个输出?
你的getUser()方法返回的是AngularFireList(旧版本叫FirebaseListObservable),这是RxJS的可观察对象,它并不会自动触发数据请求并返回结果。只有当你**订阅(subscribe)**这个Observable时,才会发起请求并拿到实际的Firebase数据。
2. 第一步:订阅Observable获取实际数据
修改你调用getUser()的组件代码,通过subscribe来获取数据:
constructor(public firebase: FirebaseProvider,public afAuth: AngularFireAuth,public navCtrl: NavController, public auth: AuthProvider) { // 订阅getUser返回的Observable,才能拿到实际数据 this.firebase.getUser().subscribe(userData => { this.user = userData; console.log('实际用户数据:', this.user); // 这里就能看到你要的内容了 }, error => { console.error('获取数据失败:', error); }); }
3. 第二步:修复用户ID的异步问题
还有一个隐藏的坑:afAuth.authState是异步流,你的this.id可能在调用getUser()时还没被赋值(因为authState的回调还没执行),这会导致请求的路径不正确,即使订阅也拿不到数据。
你可以修改FirebaseProvider里的getUser()方法,让它依赖authState的流,确保拿到用户ID后再请求数据:
// 记得先导入必要的操作符和工具 import { switchMap, of } from 'rxjs'; constructor(public afdb: AngularFireDatabase, public afAuth: AngularFireAuth, public alrtCtrl:AlertController) { console.log('Hello FirebaseProvider Provider'); } addUser(user){ firebase.database().ref('Users').child(user.UID).child('User Details').set(user); let alert = this.alrtCtrl.create({ title:'Sign Up', subTitle:'You have signed up successfully', buttons:['OK'] }) alert.present(); } getUser() { return this.afAuth.authState.pipe( switchMap(user => { if (user) { // 使用valueChanges()返回纯数据的Observable(新版本AngularFire推荐用法) return this.afdb.list('/Users/'+user.uid+'/User Details/').valueChanges(); } else { // 用户未登录时返回空数组或其他默认值 return of([]); } }) ); }
补充:关于valueChanges()和snapshotChanges()
valueChanges():返回纯JSON格式的数据,适合只需要数据内容的场景snapshotChanges():返回包含数据元数据(比如节点的key)的对象数组,如果你需要操作节点key的话可以用它
4. 验证修改效果
现在你再运行代码,订阅后的userData就是Firebase里存储的实际用户信息了。如果还是有问题,可以检查:
- Firebase数据库的规则是否允许当前用户读取
Users/{uid}/User Details路径的数据 - 用户注册时的
UID是否和user.uid一致(避免路径写错)
内容的提问来源于stack exchange,提问作者Qassim Ali
相关产品推荐
相关产品推荐

