注销

时间:2018-03-21 10:57:10

标签: javascript firebase ionic-framework firebase-authentication angularfire2

我在项目中使用Firebase + Ionic。我的问题出现在注销时。我在一些馆藏中订阅了几个onSnapshot个活动。我希望每次用户注销时都会解除所有订阅,但不是这样,所以每当我退出时,我都会收到来自Firebase的几个错误:

  

onSnapshot中未捕获的错误:错误:缺少或不足   权限。

这是我的代码:

我的控制器

/**
 * Logout button 'click' event handler
 */
onLogoutPressed(){
  this.fbAuthServ.logout().then(() => {
    this.navCtrl.setRoot(LoginPage);
  });
} 

我的服务提供商

// Firebase Modules
import { AngularFireAuth } from 'angularfire2/auth';

constructor(private afAuth: AngularFireAuth, private utils: UtilsProvider){}

...

  /**
    * Firebase Logout the current user
   */
  async logout(){
    this.afAuth.auth.signOut();
  }

您能否告诉我应该怎样做以避免那些Missing or insufficient permissions错误?

提前谢谢!

编辑:如何订阅onSnapshot事件

控制器

ionViewDidEnter(){

    this.fbDataServ.getPlacesByUserAllowed().onSnapshot(placeReceived=> {
      this.placesByUserAllowed = placeReceived.docs.map(placeSnapshot => {
        return this.utils.mapPlaceSnapshot(placeSnapshot )
      });
      this._concatPlaces();

      //Dismiss loading whenever we have data available
      this.utils.dismissLoading();
    });

服务提供商

// Firebase
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';

constructor(private afs: AngularFirestore, private fbAuthServ: FirebaseAuthServiceProvider, private utils: UtilsProvider) { }

placesCollection: AngularFirestoreCollection<PlaceModel> = this.afs.collection("places");



  /**
   * Gets the collection of places where the user is 'allowed'
   */
  public getPlacesByUserAllowed(){
    return this.placesCollection.ref
    .where('users.' + this.fbAuthServ.getCurrentUser().uid + '.allowed', '==', true);
  }

2 个答案:

答案 0 :(得分:2)

由于错误消息提及onSnapshot,我假设您正在代码中的某处访问Firebase数据库或Cloud Firestore。

您从数据库中读取的数据配置了要求用户进行身份验证的安全规则。因此,当您将用户注销时,不再满足该要求时,应用程序将失去对该数据的访问权限,并且观察者将被取消。

要防止出现此错误,请在将用户注销之前删除观察者。

<强>更新

要删除观察者/听众,请遵循Firestore documentation on detaching a listener中显示的模式。首先保留对onSnapshot的返回值的引用。

var unsubscribe = this.fbDataServ.getPlacesByUserAllowed().onSnapshot(placeReceived=> {

然后在签署用户之前调用ubsubscribe()

unsubscribe();

答案 1 :(得分:0)

以下是截至 2021 年 1 月 6 日的更新链接和代码: https://firebase.google.com/docs/firestore/query-data/listen 向下滚动到“分离侦听器”部分。代码如下:

let listener = db.collection("cities").addSnapshotListener { querySnapshot, error in
    // ...
}
    
    
// Stop listening to changes
listener.remove()