Я делаю guard в Угловом 7, чтобы проверять, ли он loggeado или не пользователь. Как back, так и просьба функционирует правильно, однако я не могу контролировать это внутри subscribe. Это код, который я разработал
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { LoginService } from '../login.service';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { StorageService } from '../storage.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor( private _login: LoginService,
private _router: Router,
private _session: StorageService) {}
canActivate(): Observable<boolean> | boolean {
this._login.isLogged()
.subscribe(
// Si la respuesta es un código HTTP 204, entonces está autorizado
() => true,
// Si la respuesta es un código HTTP 401 entonces NO está autorizado
() => {
this._session.deleteData();
this._router.navigate(['/login']);
return false;
});
}
}
Проблема - что return
.subscribe
он не возвращает true или false в canActivate(): Observable<boolean> | boolean
я не знаю, как делать, чтобы возвращать этот Booleano
У меня появляется эта ошибка
В function whose declared type is neither 'void' nor 'any' must return в value.
я пробовал до того, чтобы распределять стоимость subscribe
в переменную, чтобы делать return
в конце canActivate()
однако это асинхронная функция а следовательно он заканчивает выполнять код и не ждет ответ, я повторяю, все функционирует превосходно как ответы backend, так и функция isLogged()
которая возвращается Observable
на который я подписываюсь в guard.
Что я могу делать?
Также я попробовал эту функцию
return this._login.isLogged().pipe( map( (data: any) => {
if( data.auth ) {
return true;
} else {
this._session.deleteData();
this._router.navigate(['/login']);
return false;
}
})
)
И сейчас уже функционируй только, если есть HTTP 200, я не могу контролировать код 401