Working with AngularFireObject and switchMap

后端 未结 3 1767
后悔当初
后悔当初 2021-02-09 06:32

I really don\'t know how to fix this. How can I fix this error?

in user.service.ts:
import { Injectable } from \'@angular/core\';

import { AngularFireDatabase,          


        
相关标签:
3条回答
  • 2021-02-09 06:42

    For RxJS 6 and later, you will need to import and use Observable, map, switchMap differently:

    admin-auth-guard.service.ts:
    import { Injectable } from '@angular/core';
    import { map, switchMap } from 'rxjs/operators'
    import { Observable } from 'rxjs';
    import { UserService } from './user.service';
    import { CanActivate } from '@angular/router';
    import { AuthService } from './auth.service';
    
    @Injectable({
      providedIn: 'root'
    })
    export class AdminAuthGuardService implements CanActivate {
    
      constructor(private auth: AuthService, private userService: UserService) { }
    
      canActivate(): Observable<boolean> {
        return this.auth.user$.pipe(
          switchMap(user => this.userService.get(user.uid).valueChanges()),
          map (appUser => appUser.isAdmin)
        )
      }
    }
    
    0 讨论(0)
  • 2021-02-09 06:48

    Do it this way for Angular 6:

    user.service.ts:
    
    import { Injectable } from '@angular/core';
    
    import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
    
    import {AppUser} from './models/app.user';
    import * as firebase from 'firebase';
    import { Observable } from 'rxjs';
    
    @Injectable({
      providedIn: 'root'
    })
    export class UserService {
    
    
      constructor(private db: AngularFireDatabase) { }
    
      save(user: firebase.User) {
        this.db.object('/users/' + user.uid).update({
          name: user.displayName,
          email: user.email
        });
      }
    
      get(uid: string): AngularFireObject<AppUser> {
          return this.db.object('/users/' + uid);
      }
    
    }
    
    
    
    In admin-auth-guard.service.ts:
    
    
    import { UserService } from './user.service';
    import { map, switchMap } from 'rxjs/operators';
    import { AuthService } from './auth.service';
    import { Injectable } from '@angular/core';
    import { CanActivate } from '@angular/router';
    import { Observable } from 'rxjs';
    
    @Injectable({
      providedIn: 'root'
    })
    export class AdminAuthGuard implements CanActivate {
    
      constructor(private auth: AuthService, private userService: UserService) { }
    
      canActivate(): Observable<boolean> {
        return this.auth.user$
        .pipe(switchMap(user => this.userService.get(user.uid).valueChanges()))
        .pipe(map(appUser => appUser.isAdmin));
       }
    
    }
    
    0 讨论(0)
  • 2021-02-09 06:51

    I found the answer:

    user.service.ts:
    
    import { Injectable } from '@angular/core';
    
    import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
    
    import {AppUser} from './models/app.user';
    import * as firebase from 'firebase';
    import { Observable } from 'rxjs';
    
    @Injectable({
      providedIn: 'root'
    })
    export class UserService {
    
    
      constructor(private db: AngularFireDatabase) { }
    
      save(user: firebase.User) {
        this.db.object('/users/' + user.uid).update({
          name: user.displayName,
          email: user.email
        });
      }
    
      get(uid: string): AngularFireObject<AppUser> {
          return this.db.object('/users/' + uid);
      }
    
    }
    
    In admin-auth-guard.service.ts:
    
    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs/observable';
    import 'rxjs/add/operator/switchMap';
    import 'rxjs/operator/map';
    import { UserService } from './user.service';
    import { CanActivate } from '@angular/router';
    import { AuthService } from './auth.service';
    
    
    
    
    @Injectable({
      providedIn: 'root'
    })
    export class AdminAuthGuard implements CanActivate {
    
      constructor(private auth: AuthService, private userService: UserService) { }
    
       canActivate(): Observable<boolean> {
          return this.auth.user$
          .pipe(switchMap(user => this.userService.get(user.uid).valueChanges())))
          .pipe(map (appUser => appUser.isAdmin)));
         }
    }
    

    Thanks everybody!

    0 讨论(0)
提交回复
热议问题