Angular / Firebase - Guard запускается до инициализации Firebase - PullRequest
0 голосов
/ 19 февраля 2019

См. Проблему здесь (открытая консоль):

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]
  }
];

Однако, это приводит к следующей ошибке:

ОШИБКА Ошибка: Uncaught (в обещании): [DEFAULT]: Firebase: не создано приложение Firebase '[DEFAULT]' - вызовите Firebase App.initializeApp () (app / no-app).[DEFAULT]: Firebase: приложение Firebase «[DEFAULT]» не создано - вызовите Firebase App.initializeApp () (app / no-app).при ошибке (index.cjs.js: 361) в приложении (index.cjs.js: 244) в Object.serviceNamespace [как auth] (index.cjs.js: 302) в AuthGuard.performCheck (auth.guard.ts:35) в AuthGuard.canActivate (auth.guard.ts: 29) в eval (check_guards.ts: 121) в Observable.eval [как _subscribe] (defer.ts: 59) в Observable._trySubscribe (Observable.ts: 231)в Observable.subscribe (Observable.ts: 212) в TakeOperator.call (take.ts: 72) в resolPromise (zone.js: 831) в resolPromise (zone.js: 788) в eval (zone.js: 892) вZoneDelegate.invokeTask (zone.js: 423) в Object.onInvokeTask (ng_zone.ts: 262) в ZoneDelegate.invokeTask (zone.js: 422) в Zone.runTask (zone.js: 195) в сливеMicroTaskQueue (zone.js: zone: js601)

Что означает, что при рассмотрении других проблем приложение еще не инициализировало Firebase, что странно, поскольку я делаю это раньше всего на свете ... И теоретически охранник должен запускаться ПОСЛЕ все это происходит, верно?

Как я могу решить это?

1 Ответ

0 голосов
/ 19 февраля 2019

Я бы настроил охрану по-другому, потому что по какой-то причине эта строка:

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));
  }
}

обновленный стек Blitz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...