ionic2 - angularfire2 - firestore:注销时

时间:2017-10-19 13:47:52

标签: firebase ionic2 google-cloud-firestore

我在使用firebase的“firestore”服务处理离子2项目时遇到了这个问题。

我有一个osservable使用异步管道从模板中的firestore获取一些数据。 此EndPoint上的规则仅对已登录用户提供读写访问权限。 当我退出时,我将重定向发送到登录页面。

..现在问题......

当我登陆登录页面时,几秒钟后,跳出IonicErrorHandler通知我没有足够的权限。

如此; 我怎么能告诉firestore osservable; “嘿伙计,停下来,如果有人再次登录,我会打电话给你”

(生病尝试取消订阅()但是没有工作,但也没有工作 它不是来自持久性)

重述:

当我登录

    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次。确切地说是收藏品中的文件数量)

我调用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 };
        });
      });
  }

}
事先提前帮助我理解它 :)

3 个答案:

答案 0 :(得分:2)

在注销后调用它解决了这个问题:

afStore.firestore.disableNetwork();

答案 1 :(得分:1)

是,

通常,这可以通过在您导航的组件的ngOnDestroy()中取消订阅您的订阅来解决。 这就是我这样做的方式。

所以对你而言,那就是:

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

但是,很难确定哪些应该取消订阅,因为错误没有给出任何指示。

我在你的问题上向angularFire的开发者添加了一个问题:

dataProviders

很高兴有帮助,以便异常指向正确的方向,例如,未取消订阅的路径或最后一个路径段。

此外,还有其他方法可以执行此操作: https://github.com/angular/angularfire2/issues/1459.

希望有所帮助。

答案 2 :(得分: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()),
);