2017-11-21 8 views
0

Firebase 및 Angular의 최신 버전을 사용하려고합니다. 달성하고자하는 전반적인 개념은 관리자 인증입니다. 나는 로그인 로그 아웃 기능을 달성했다. googleAuth 로그인 사용자를 UID가있는 데이터베이스에 저장했습니다. 이제 내가하려는 것은 일부 페이지를 로그인 및 관리로 제한하는 것입니다. 그래서 isAdmin : true를 데이터베이스에 저장된 사용자 객체의 값으로 할당했습니다. 기본적으로 나는 사용자가 admin인지 확인하고 라우터 params에 대해 true 또는 false를 반환하려고합니다. Angular과 Firebase을 켜고 끔 사용하고 있습니다. 나는 나 자신을 초심자로 생각할 것이다. , 내가 함수가 객체를 반환 가져 오기를 이해 생각에서오류 TS2345 사용자가 isAdmin인지 각도 AngularFire2 확인

ERROR in src/app/admin-auth-guard.service.ts(15,38): error TS2345: Argument of type '(user: User) => AngularFireObject<AppUser>' is not assignable to parameter of type '(value: User, index: number) => ObservableInput<{}>'. 
    Type 'AngularFireObject<AppUser>' is not assignable to type 'ObservableInput<{}>'. 
    Type 'AngularFireObject<AppUser>' is not assignable to type 'ArrayLike<{}>'. 
     Property 'length' is missing in type 'AngularFireObject<AppUser>'. 

하지만 :> AngularFire 5. 내가 점점 오전 현재 오류가 TS2345이다 - 나는 아주 AngularFire2 4에서 마이그레이션하는 방법을 이해할 수 없다 오류가 관찰 가능을 기대하고 있습니다. 내가 관찰 할 수있는 것에 대해 알고있는 것은 당신이 그들을 구독 할 수 있고 그것들을 파괴해야한다는 것입니다 ...

데이터베이스에 쿼리하고 uid와 일치하는 사용자 개체를 반환하기 위해 현재 로그인 한 사용자 ID를 사용해야합니다. isAdmin이 true 또는 false 인 경우 그런 다음 경로 매개 변수로 반환하여 페이지를 인증 된 및 관리자로 제한 할 수 있습니다.

올바른 방향으로 알려주십시오.

관리 - 인증 - guard.service.ts

import { Injectable } from '@angular/core'; 
import { CanActivate } from '@angular/router'; 
import { AuthService } from './auth.service'; 
import { UserService } from './user.service'; 
import 'rxjs/add/operator/switchMap'; 
import 'rxjs/add/operator/map'; 
import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class AdminAuthGuardService implements CanActivate { 

    constructor(private auth: AuthService, private userService: UserService) { } 

    canActivate(): Observable<boolean> { 
    return this.auth.user$.switchMap(user => this.userService.get(user.uid)).map(appUser => appUser.isAdmin); 
    } 

} 

user.service.ts

import { Injectable } from '@angular/core'; 
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database'; 
import * as firebase from 'firebase'; 
import { Observable } from 'rxjs/Observable'; 
import { AppUser } from './models/app-user'; 

@Injectable() 
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); 
    } 

} 

이 내가 도움을 사용하고있는 것입니다 : https://github.com/angular/angularfire2/blob/master/docs/version-5-upgrade.md

내가 돈 ' 주석이 작성된 함수에 대해 정확히 어떻게 작동하는지 이해합니다. "observable"에 대한 참조에서 이것은 canActivate() 함수가 Observable에서 확장되어 부울 (true/false)을 반환해야 함을 의미합니다.

감사합니다.

+1

하는'시도 수 (UID : 문자열) : 하나의 오류가 감사 멀리 이동했다 any' –

+0

@BougarfaouiElhoucine을! 새로운 것이 나타났습니다. "src/app/admin-auth-guard.service.ts (15,101)의 오류 : 오류 TS2339 : 'isAdmin'속성이 '{}'유형에 없습니다." – alex

+0

답변보기. –

답변

1
get(uid: string): Observable<any> { 
    return this.db.object('/users/' + uid).valueChanges(); 
} 

그리고 자세한 내용

canActivate(): Observable<boolean> { 
    return this.auth.user$.switchMap(user => 
    this.userService.get(user.uid)).map((appUser :any) => appUser.isAdmin); 
} 

참조 : info