Guard всегда перенаправляет на маршрут по умолчанию
У меня есть охранник, который проверяет сеанс пользователя. Я создаю наблюдаемое из обещания и возвращаю это наблюдаемое.
К сожалению, маршрутизатор всегда перенаправляет меня на домашнюю страницу при обновлении. Я предполагаю, что это связано с наблюдаемым, так как когда я просто перемещаюсь, он вводит if и возвращает Observalbe.of (true), который работает.
@Injectable()
export default class SessionGuard implements CanActivate {
constructor(private authService: AuthService) {}
public canActivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.authService.hasSessionChecked) {
return Observable.of(true).take(1);
}
const obs = Observable.fromPromise(this.authService.getSession());
return obs.map((session) => {
this.authService.setUserSession(session);
return true;
}).take(1);
}
}
Я попытался заменить наблюдаемое "верным истиной", и все работает как ожидалось.
Есть идеи? Спасибо!
3 ответа
Это не работает, потому что canActivate
должен вернуть логическое значение.
Почему вы хотите использовать Observable?
Как предложил @trichetriche, я заменил наблюдаемое обещанием и вернул его.
Теперь он отлично работает.
return this.authService.getSession().then(
data => {
this.authService.setUserSession(data);
return true;
},
err => false,
);
Во-первых, определение canActivate
является следующим:
export interface CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}
Поэтому вы должны добавить параметры в функцию.
Во-вторых, если вы собираетесь возвращать наблюдаемую и только наблюдаемую, то измените тип возврата на просто наблюдаемый. Если вам нужен микс, вы можете оставить более одного типа возврата.
В-третьих, удалите оператор take() и рефакторинг охранника, чтобы он выглядел так:
@Injectable()
export default class SessionGuard implements CanActivate {
constructor(private authService: AuthService) {}
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
if (this.authService.hasSessionChecked) {
return true;
}
const obs = Observable.fromPromise(this.authService.getSession());
return obs.map(session => {
this.authService.setUserSession(session);
return true;
});
}
}