Я недавно обновил мое приложение angular 2 до angular 7. Одной из проблем, с которыми я столкнулся, был user.service.ts
, где у меня есть метод isAuthentiated
.По сути, этот метод передается в auth.guard.ts
, чтобы я мог направлять пользователей, если их имени нет в моем списке.
User Service извлекает пользователей, затем isAuthenticated проверяет пользователей.Auth guard проверяет пользователя.Если пользователь находится в списке, предоставьте доступ, в противном случае перейдите на определенный веб-сайт.
user.service.ts
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { map, catchError, tap } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
@Injectable()
export class UserService {
baseUrl = environment.apiUrl;
constructor(private http: HttpClient) { }
private extractData(res: Response) {
const body = res;
return body || { };
}
... other methods
isAuthenticated(): Observable<boolean> {
return this.http.get(this.baseUrl + 'users').pipe(
map(this.extractData),
map(res => !!res.length)
);
}
}
И мой auth.guard.ts
:
import { UserService } from './../_services/user.service';
import { Injectable } from '@angular/core';
import { CanActivate, RouterStateSnapshot, Router } from '@angular/router';
import { AlertifyService } from '../_services/alertify.service';
import { map } from 'rxjs/operators';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private userService: UserService,
private alertifyService: AlertifyService,
private router: Router
) {}
canActivate(route, state: RouterStateSnapshot) {
return this.userService.isAuthenticated().pipe(map(user => {
if (!user) {
return true;
} else {
this.router.navigate(['/authentication/get-jhed']);
this.alertifyService.error('You need to be authenticated to access this area');
return false;
}
}));
}
}
Этот код возвращает следующую ошибку:
Ошибка: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'length' с неопределенным
Я пытался res[0].length
Я не получил ошибку, но на этот раз ничего не произошло.
Я могу решить эту проблему, используя Http
, как показано ниже:
isAuthenticated(): Observable<boolean> {
return this.http.get(this.baseUrl + 'users').pipe(
map(res => res.json()),
map(res => !!res.length)
);
}
Обратите внимание, что здесь я использую Http
, НЕ HttpClient
.
Буду признателен за любую помощь!