Я пытаюсь защитить URL-адреса в зависимости от того, имеет ли пользователь статус администратора (isAdmin = true). Сервис AdminAuthGuard проверяет, имеет ли пользователь такой статус администратора, вызывая функцию get (uid) в сервисе UserService. Эта функция get вызывает интерфейс AppUser, который выделяет соответствующие поля.
Данные извлекаются из базы данных Firebase с использованием AngularFire 2. Подробнее о версии см. Ниже.
Я получаю следующие ошибки:
ERROR in src/app/admin-auth-guard.service.ts(21,17): error TS2345: Argument of type '(user: {}) => AngularFireObject<AppUser>' is not assignable to parameter of type '(value: {}, index: number) => ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'Iterable<{}>'.
Property '[Symbol.iterator]' is missing in type 'AngularFireObject<AppUser>'.
src/app/admin-auth-guard.service.ts(21,51): error TS2339: Property 'uid' does not exist on type '{}'.
Строка, на которую ссылаются ошибки:
switchMap(user => this.userService.get(user.uid))
Настройка моей системы:
Angular CLI: 6.0.1
Node: 10.1.0
rxjs: 6.1.0
Firebase: 5.0.2
AngularFire2: 5.0.0-rc.8.0
админ-Auth-guard.service.ts
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { Observable } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { AuthService } from './auth.service';
import { UserService } from './user.service';
import { AppUser } from './models/app-user';
@Injectable({
providedIn: 'root'
})
export class AdminAuthGuard implements CanActivate {
constructor(private userService: UserService, private auth: AuthService) { }
canActivate(): Observable<boolean> {
return this.auth.user$.pipe(
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 { AppUser } from './models/app-user';
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private db: AngularFireDatabase) { }
get(uid: string): AngularFireObject<AppUser> {
return this.db.object('/users/' + uid);
}
}
app-user.ts (модель для пользователей)
export interface AppUser {
name: string;
email: string;
isActive: boolean;
}