Я видел несколько ответов на SO по этой же теме, но я считаю, что в Angular 13.x поведение другое. В приведенном ниже коде canActivate должен возвращать наблюдаемое логическое значение. Таким образом, все пути кода ДОЛЖНЫ возвращать наблюдаемое логическое значение, если я удалю эту строку:
return of(valid); // always hits first
Я получаю ошибку компиляции:
error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value.
Это имеет смысл. Мне нужно вернуть наблюдаемое логическое значение. Однако я все еще не уверен, как заставить canActivate
ждать, пока this.authService.authCheck()
вернет ответ?
Вот что я пробовал:
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable, of, map, catchError, observable } from 'rxjs';
import { AuthService } from '../data/auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) { }
canActivate(
route: ActivatedRouteSnapshot): Observable<boolean> {
var valid = false;
this.authService.authCheck().subscribe(response => {
if (!response) {
this.router.navigateByUrl('login');
valid = false;
return valid;
} else {
valid = true;
return valid;
}
});
return of(valid); // always hits first
}
}
карту тоже пробовал
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
this.authService.authCheck().pipe(map(r => {
if (!r) {
console.info("failure");
this.router.navigateByUrl('login');
return false;
} else {
return true;
}
})); // error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value.
}
Вы должны вернуть Observable
, поэтому ваш первый подход с subscribe
неверен. Ты был довольно близок со вторым - ты пропал return
.
Следующий код должен работать:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.authService.authCheck().pipe(map(r => {
if (!r) {
console.info("failure");
this.router.navigateByUrl('login');
return false;
} else {
return true;
}
}));
Я думаю, что я смотрел на него слишком долго. Спасибо за помощь