【问题标题】:Can't check if profile exist in firebase with Angular [Ionic]无法使用Angular [Ionic]检查Firebase中是否存在配置文件
【发布时间】:2018-09-29 13:01:27
【问题描述】:

拜托,我需要帮助,我正在尝试使用 Angular(Ionic)检查用户配置文件是否存在于 Firebase 数据库中。因此,如果存在则转到 TabsPage,如果不存在则转到 EditProfiePage。

但它没有用。它返回null!并始终转到 EditProfilePage,请检查以下代码:

this.data.getProfile(<User> event.result).subscribe(profile =>{

console.log(profile);

if (profile.hasOwnProperty('$value') && !profile['$value'] )
{
this.navCtrl.setRoot("TabsPage")
}

else {
this.navCtrl.setRoot("EditProfilePage");
}

数据提供者:

public getProfile(user: User){

this.profileObject = this.database.object(`profiles/${user.uid}`);

return this.profileObject.snapshotChanges().pipe(first());

}

看图: Picture: The result is null

【问题讨论】:

  • Hossam 您使用的是 Firebase Cloud Firestore 还是 RealTime 数据库?
  • 你好guardezi,我正在使用实时数据库。

标签: javascript angular firebase ionic-framework


【解决方案1】:

感谢所有回答。

我通过以下方式解决了这个问题:

1- 我导入了 Subscription,然后我声明了 Subscription 类型的 'authenticatedUser$' var,然后我声明了 User(firebase 用户)类型的 'authenticatedUser' var。 - “login.ts”

2- 在构造函数中,我将在 'authenticatedUser$' var 中获取当前 Authenticated User,然后将其订阅到 'authenticatedUser' var。 - “AuthProvider.ts”

3- 最后一件事,我会将authenticatedUser var 作为参数发送给我的DataProvider,并且我将订阅返回值。 - “DataProvider.ts”

AuthProvider:

import { LoginResponse } from '../../models/login-response';
import { Injectable } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import { Account } from '../../models/account';

....................

constructor(public auth:AngularFireAuth) {
    console.log('Hello AuthProvider Provider');
  }

public getAuthenticatedUser(){
    return this.auth.authState;
  }

数据提供者:

import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject, AngularFireList } from 'angularfire2/database';
import { User } from 'firebase/app';
import { Profile } from '../../models/profile';

................

profileObject: AngularFireObject<any>;

  constructor(public database: AngularFireDatabase) {
  }

  public getProfile(user: User){

    this.profileObject = this.database.object(`profiles/${user.uid}`);

    return this.profileObject.valueChanges();

  }

login.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ToastController } from 'ionic-angular';
import { LoginResponse } from '../../models/login-response';
import { DataProvider } from '../../providers/data/data';
import { User } from 'firebase/app';
import { Subscription } from 'rxjs/Subscription';
import { AuthProvider } from '../../providers/auth/auth';

................

user = {} as User;

  private authenticatedUser$: Subscription;
  private authenticatedUser: User;


  constructor(public navCtrl: NavController, 
    public toast:ToastController, public navParams: NavParams, public data: DataProvider,
     private myAuthProvider:AuthProvider) {

      this.authenticatedUser$ = this.myAuthProvider.getAuthenticatedUser()
      .subscribe((user: User)=>{
        this.authenticatedUser = user 
    }) 

this.data.getProfile(this.authenticatedUser).subscribe(profile =>{

              console.log(profile);

              if (profile) {
                this.navCtrl.setRoot("TabsPage")
              } else {
                this.navCtrl.setRoot("EditProfilePage");
              }
            });

  }

【讨论】:

    【解决方案2】:

    在您的数据提供者中

    代替

    return this.profileObject.snapshotChanges().pipe(first());

    你可以试试

    return this.profileObject.valueChanges();

    【讨论】:

    • 同样的事情。它说:“无法读取 null 的属性 'hasOwnProperty'”。
    【解决方案3】:

    无需检查对象是否具有属性。一个简单的 if 语句就足够了。

    public getProfile(user: User){
    
      this.profileObject = this.database.object(`profiles/${user.uid}`);
    
      return this.profileObject.valueChanges();
    
    }
    

    if 语句检查配置文件是否存在(如果不存在,则结果未定义或为空)

    this.data.getProfile(user).subscribe(profile =>{
    
      if (profile) {
        this.navCtrl.setRoot("TabsPage")
      } else {
        this.navCtrl.setRoot("EditProfilePage");
      }
    });
    

    【讨论】:

    • 也是一样的。它说“空”。虽然配置文件存在。 (i.imgur.com/RgebAGJ.png)
    • @HossamBrgoth 你能 console.log() 配置文件/user.uid 吗?
    • @HossamBrgoth 不是这样。 console.log(`profiles/${user.uid}`) 这将告诉您传递的参数是否实际存在于该点
    猜你喜欢
    • 2020-12-17
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2018-06-12
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多