2017-01-22 12 views
3

私はFirebaseとAngularFire2ライブラリを使ってAngular2アプリを構築しています。Firebaseデータベースに接続した後、ユーザログアウトをどのように処理しますか?

認証された接続が確立された後にユーザーがログアウトすると、どのように処理されますか?たとえば、有効なアカウントを持つユーザがログインし、Firebaseデータベースの "orders"ノードに接続した後、ユーザはログアウトします。

以下のエラーがコンソールに表示されますが、これは理にかなっています。しかし、私はこのエラーをキャッチするか、そうでなければそれを防ぐべきですか?

エラー:

FIREBASE WARNING: Exception was thrown by user callback. Error: permission_denied at /orders: Client doesn't have permission to access the desired data. 

関連するコード(と思う):

@Injectable() 
export class OrderService { 

    private orders$: FirebaseListObservable<any>; 
    private _pendingOrders$: BehaviorSubject<any> = new BehaviorSubject(null); 
    private _activeOrders$: BehaviorSubject<any> = new BehaviorSubject(null); 

    constructor(
    private af: AngularFire, 
    private auth: AuthService) { 
    this.auth.isAuthed 
     .subscribe((value: boolean) => { 
     if (this.auth.isAuthed.value) { 
      const userId = this.auth.getUserId(); 
      this._subscribeToUserOrders(userId); 
     } else { 
      // Somehow unsubscribe here, perhaps? 
     } 
     }); 
    } 

    _subscribeToUserOrders(userId) { 
    const query = { 
     orderByChild: 'userId', 
     equalTo: userId 
    }; 

    this.orders$ = this.af.database 
     .list(`orders`, query); 

    this.orders$.subscribe((orders) => { 
     // Load pending orders 
     this._pendingOrders$.next(orders.filter(o => o.status === 'PENDING')); 

     // Load active orders 
     this._activeOrders$.next(orders.filter(o => o.status === 'ACTIVE')); 
    }); 
    } 

    get pendingOrders() { 
    return this._pendingOrders$.asObservable(); 
    } 

    get activeOrders() { 
    return this._activeOrders$.asObservable(); 
    } 
} 

答えて

1

this.orders$.subscribeへの呼び出しはRxJS Subscriptionを返します。

あなた
import { Subscription } from 'rxjs/Subscription'; 

private ordersSubscription: Subscription; 
... 
this.ordersSubscription = this.orders$.subscribe(...); 

退会するために使用することができます(おそらく)あまりにも、あなたの科目からnullを放出することになるでしょう:

if (this.auth.isAuthed.value) { 
    const userId = this.auth.getUserId(); 
    this._subscribeToUserOrders(userId); 
} else { 
    this._unsubscribeFromUserOrders(); 
} 
... 
_unsubscribeFromUserOrders() { 
    this.ordersSubscription.unsubscribe(); 
    this.orders$ = null; 
    this._pendingOrders$.next(null); 
    this._activeOrders$.next(null); 
} 
+0

追加する必要がありました「場合(this.orderSubscription)リターン;!」をログインのタイミングの問題のために_unsubscribeFromUserOrdersの先頭に移動しましたが、これは魅力的でした。ありがとう! –

関連する問題