2017-10-10 55 views
2

是否可以取消訂閱valueChanges()? 當我的用戶登錄,我取他們的用戶數據這樣Firestore:取消訂閱valueChanges(用戶在註銷時獲取「丟失的權限」)

this.user$ = this.afAuth.authState.flatMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(this.user); 
    } 

    return this.db.doc<UserServerData>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

當然,我對公司的FireStore規則說,只有與特定的ID的用戶可以讀取該用戶DATAS ... 所以,當用戶註銷,每個用戶id上的規則查詢都會失敗,並且出現「Missing permissions」錯誤。

所以這裏是我的問題,我該怎麼做? 有沒有辦法取消訂閱查詢?

非常感謝

回答

1

AngularFire的作者在這裏。

您有兩種選擇。爲註銷用戶返回一個空集或使用路由警衛。

返回空集很容易。將.of(null)替換爲空數組。

this.user$ = this.afAuth.authState.switchMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(null); 
    } 
    return this.db.doc<UserServerData | null>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

Using a route guard is a bit more complicated,並要求對@angular/router的依賴。但是,它將確保用戶在路由加載之前存在。

+0

嗨大衛。謝謝。爲什麼我應該返回一個數組,因爲我在查詢文檔而不是集合?無論如何,我已經嘗試過它和Typescript編譯失敗,因爲我的Observable期待一個「用戶」類型的數據('用戶$:Observable '),我試圖給他一個空數組。另外我正在使用Ionic,所以我沒有角度路由器。由於我在switchMap中,我們確定Firestore查詢不是由authState更改觸發的嗎?再次感謝(Love the Firecasts) – Maslow

+0

好點!我更新它允許空值或用戶。這取決於你的模板。我建議使用null抑制運算符(?)來解決此問題。 –

+0

對不起大衛。可悲的是,這並沒有解決問題。我們告訴查詢它現在可以返回null,但仍然會嘗試在'users/UID'處獲取用戶,所以我們仍然會出現「權限不足或不足」的錯誤。我認爲對'authUser'的檢查就足夠了,但看起來像在FireMap的連接是在switchMap中進行的。也許這是問題?我是否應該在某處捕獲錯誤以避免運行時錯誤? – Maslow