2017-10-19 27 views
2

firebaseのfirestoreサービスのionic2プロジェクトでこの問題が発生しました。ionic2 - angularfire2 - firestore:ログアウトの権限が不足しているか不十分です

私は、非同期パイプを使用してテンプレート内のFirestoreからデータを取得するためのosservableを持っています。 このEndPointのルールは、ログに記録されたユーザーのみに読み取りおよび書き込みアクセスを許可します。 私がサインアウトするとき、私はログインページにリダイレクトします。

..and今は問題に来る..

私は数秒後、私は十分な権限を持っているIonicErrorHandler通知を飛び出す、ログインページに上陸

so; 私はfirestore osservableにどのように伝えることができますか? は

を(サインアウトbefour病気(退会をしてみてください)が、動作しない、とも
それが永続からない)「男ねえ、それを停止し、私は誰かが再度、ログインした場合、後のuを呼びます」

リキャップ:

私はログアウト

this.afAuth.auth.signOut(); 

エラー:

core.es5.js:1020 ERROR Error: Missing or insufficient permissions. 
at new FirestoreError (error.js:164) 
at JsonProtoSerializer.fromRpcStatus (serializer.js:126) 
at JsonProtoSerializer.fromWatchChange (serializer.js:517) 
at PersistentListenStream.onMessage (persistent_stream.js:334) 
at persistent_stream.js:270 
at persistent_stream.js:247 
at async_queue.js:81 
at t.invoke (polyfills.js:3) 
at Object.onInvoke (core.es5.js:3890) 
at t.invoke (polyfills.js:3) 

(正確には、私はそれを3回recive。正確数またはコレクション内のドキュメントの)

私はfirestoreエンドポイントを呼び出すサービス:

export interface Attivita { 
    id: string; 
    committente: string; 
    durata: number; 
    nome: string; 
    progetto: string; 
    userId: string; 
} 

@Injectable() 
export class FirebaseService { 

    attivitaCollectionRef: AngularFirestoreCollection<Attivita>; 
    attivita$: Observable<Attivita[]>; 

    constructor(private afs: AngularFirestore, 
       public afAuth: AngularFireAuth) { 

} 

    setOsservableAttivita(uId){ 
    this.attivitaCollectionRef = this.afs.collection('attivita', ref => { 
     return ref.where("userId", "==", uId) 
     }); 
     this.attivita$ = this.attivitaCollectionRef.snapshotChanges().map(actions => { 
     return actions.map(action => { 
      console.log(action) 
      const data = action.payload.doc.data() as Attivita; 
      const id = action.payload.doc.id; 
      return { id, ...data }; 
     }); 
     }); 
    } 

} 

全てに事前にTKSは私がそれ を理解するのに役立つ:)

+0

これを解決できましたか?私もこの同じ問題にぶつかります –

+0

私はすでにこの問題を1週間抱えています。誰も私を助けることを願っています! – Sifeng

+0

ログインページのコレクションを呼び出しましたか? – Hareesh

答えて

1

をはい、

通常これは、離れてナビゲートしているコンポーネントのngOnDestroy()でサブスクリプションの登録解除を行うことで解決します。 それが私のやり方です。

だからあなたのために、それは次のようになります。

ngOnDestroy() { 
     this.attivita$.unsubscribe(); 
} 

しかし、エラーがその上の任意の表示を与えないよう、あなたが退会べきピンポイントで特定することは非常に困難です。

私はあなたの問題についてangularFireの開発者に質問を追加しました:

https://github.com/angular/angularfire2/issues/1459.

例外が正しい方向にあなたを指すように、たとえば、役立っているといいだろう、パスをこれは予約解除されていないか、最後の経路セグメントであった。 http://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/

役に立てば幸い:

はまた、この記事に記載されているこれを行うための代替方法があります。

1

私はFirebaseからauthStateを見て、あなたが認証されている間にsnapshotChangesから取ることを推奨します。 switchMap演算子を使用すると、ユーザーが認証されているかどうかなどの条件に基づいて監視対象を切り替えることができます。可能な解決策の例を以下に示します。

// Assuming rxjs 5.5.0 with lettable operators 

import { map } from 'rxjs/operators/map'; 
import { switchMap } from 'rxjs/operators/switchMap'; 
import { empty } from 'rxjs/observable/empty'; 
import { create } from 'rxjs/observable/create'; 

const actions$ = this.attivitaCollectionRef.snapshotChanges() 
    .map(actions => { 
     return actions.map(action => { 
      console.log(action) 
      const data = action.payload.doc.data() as Attivita; 
      const id = action.payload.doc.id; 
      return { id, ...data }; 
     }); 
    }); 
}), 


this.attivita$ = create(
    // Listen for changes in the authState 
    subscriber => this.afAuth.onAuthStateChanged(subscriber)) 
) 
.pipe(

    // Determine if the user is logged in 
    map(user => !!user), 

    // switchMap will unsubscribe from the previous observable 
    // so when isLoggedIn switches to false actions$ will be unsubscribed from 
    switchMap(isLoggedIn => isLoggedIn ? actions$ : empty()), 
); 
関連する問題