Angular/Firebase - Guard 在 Firebase 初始化完成之前运行

标签 angular typescript firebase angularfire2

在此处查看问题(打开控制台):

https://stackblitz.com/edit/angular-su5p89?file=src%2Fapp%2Fapp.module.ts

我已经导入并调用了initalizeApp在我的AppModule像这样:

import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { AngularFirestoreModule } from '@angular/fire/firestore';

@NgModule({
  imports: [
    BrowserModule.withServerTransition({ appId: 'serverApp' }),

    // Firebase
    AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

    // App
    AppRoutingModule
  ],
  declarations: [
    AppComponent
  ],
  bootstrap: [AppComponent]
})

export class AppModule {}

然后我创建了一个看起来像这样的守卫:
import { Injectable } from '@angular/core';
import { CanActivate, CanActivateChild, CanLoad } from '@angular/router';
import * as firebase from 'firebase/app';

@Injectable({
  providedIn: 'root'
})

export class AuthGuard implements CanActivate, CanActivateChild, CanLoad {

  /** @ignore */
  constructor() {}

  canLoad(): boolean {
    return this.performCheck();
  }

  canActivate(): boolean {
    return this.performCheck();
  }

  canActivateChild(): boolean {
    return this.performCheck();
  }

  private performCheck() {
    return !!firebase.auth().currentUser;
  }
}

并像这样使用它:
export const Routes = [
  {
    path: '',
    pathMatch: 'full',
    redirectTo: 'hello'
  },
  {
    path: 'hello',
    component: HelloComponent,
    canActivate: [AuthGuard]
  }
];

但是,这会产生以下错误:

ERROR Error: Uncaught (in promise): [DEFAULT]: Firebase: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp() (app/no-app). [DEFAULT]: Firebase: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp() (app/no-app). at error (index.cjs.js:361) at app (index.cjs.js:244) at Object.serviceNamespace [as auth] (index.cjs.js:302) at AuthGuard.performCheck (auth.guard.ts:35) at AuthGuard.canActivate (auth.guard.ts:29) at eval (check_guards.ts:121) at Observable.eval [as _subscribe] (defer.ts:59) at Observable._trySubscribe (Observable.ts:231) at Observable.subscribe (Observable.ts:212) at TakeOperator.call (take.ts:72) at resolvePromise (zone.js:831) at resolvePromise (zone.js:788) at eval (zone.js:892) at ZoneDelegate.invokeTask (zone.js:423) at Object.onInvokeTask (ng_zone.ts:262) at ZoneDelegate.invokeTask (zone.js:422) at Zone.runTask (zone.js:195) at drainMicroTaskQueue (zone.js:601)



在查看其他问题时,这意味着应用程序尚未初始化 Firebase,这很奇怪,因为我在其他任何事情之前就这样做了。理论上 guard 应该运行 之后 这一切都会发生,对吧?

我该如何解决这个问题?

最佳答案

我会以不同的方式配置 guard ,因为出于某种原因,这条线:
import * as firebase from 'firebase/app';
导致第二次初始化并且没有 initializeApp()调用导致错误的方法。

import { Injectable } from '@angular/core';
import { CanActivate, CanActivateChild, CanLoad } from '@angular/router';
import { AngularFireAuth } from '@angular/fire/auth'; // instead of firebase
import { Observable } from 'rxjs';
import { take, map } from 'rxjs/operators'

@Injectable({
  providedIn: 'root'
})

export class AuthGuard implements CanActivate, CanActivateChild, CanLoad {

  /** @ignore */
  constructor(private auth: AngularFireAuth) {}

  canLoad(): Observable<boolean> {
    return this.performCheck();
  }

  canActivate(): Observable<boolean> {
    return this.performCheck();
  }

  canActivateChild(): Observable<boolean> {
    return this.performCheck();
  }

  private performCheck(): Observable<boolean> {
    return this.auth.user.pipe(map((user) => {
      if (user) {
        // user is logged in
        return true;
      }
      // user is not logged in
      return false;
    }), 
    take(1));
  }
}

updated stackBlitz

关于Angular/Firebase - Guard 在 Firebase 初始化完成之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54762100/

相关文章:

typescript - 箭头功能与界面内的普通功能之间的区别

javascript - 如何将 highchart-more 导入 angular-cli 6 项目

java - 如何使用 java Firebase Admin SDK 将分析标签添加到数据消息?

Angular 6应用程序刷新后重定向到root

angular - 在文件 :///without server 上本地运行 Angular 7 项目

angular - @Input 不适用于 OnPush 更改检测

Angular2 NgFor 在表达式中绑定(bind)数组

Firebase auth onUpdate 云功能,用于当用户更新他们的电子邮件时

javascript - Node js 不断重定向 - 中间件

angular - 错误 TS2307 : Cannot find module 'marked' or its corresponding type declarations