Как сделать так, чтобы охранник подписывался на длинный запрос службы в Angular 2

Я пытаюсь сделать угловую 2 версию старого модного приложения. Существует служба, которая отправляет повторяющийся запрос на сервер, чтобы проверить, вошел ли пользователь в систему или нет. Охрана входа в систему проверит опрос, чтобы увидеть, является ли результат сеанса входа в систему (получить из запроса) действительным или нет, чтобы вернуть правильный сигнал на маршрут.

Это функция моего сервиса:

getUser(): Observable<User> { return this.http.get<User>(this.userUrl); }

Это функция canActive от моей охраны:

canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { // const isLoggedIn = this.authService.isLoggedIn(); return this.authService.getUser().flatMap((data) => { console.log(data); if (data.id === 1 && data.name === 'Beany' ) { console.log(1111) return Observable.of(true); } else { console.log(2222) this.router.navigate(['pages/login']); return Observable.of(false); } });

Маршрут работает но только 1 раз. Не уверен, возможно ли повторить это действие (служба отправит проверку службе, когда запрос будет завершен, конечно, я должен сделать для него небольшой тайм-аут)?

1 ответ

На самом деле я не думаю, что это хорошая практика - проверять время ожидания сессии. canActivate guard - это простая проверка, например, что у пользователя есть разрешение открыть этот маршрут или нет. Для проверки тайм-аута сеанса я бы добавил в ваш сервис таймер, который будет вызывать бэкэнд для получения информации. Я бы также использовал HttpInterceptor проверить ошибки из бэкэнда. Когда ваш бэкэнд отправит сообщение об ошибке с кодом 401 UNAUTHORIZED он переместит пользователя на страницу входа, как вы можете видеть в примере ниже.

@Injectable()
export class UnauthorizedInterceptor implements HttpInterceptor {

    constructor(private router: Router) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(req).catch(err => {
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    this.router.navigate(['/Login']);
                }
            }
            return Observable.throw(err.statusText);
        });
    }
}
Другие вопросы по тегам