Обрабатывать HttpErrorResponse из Observable, который не возвращает логическое значение внутри canActivate () - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать функцию canActivate(), которая будет:

return false;
this.router.navigateByUrl('/login'); 

, когда код состояния будет 401 из Observable, т.е. когда HttpErrorResponse повышено.

==============================================

Это мой сервис:

currentUser(token): Observable<any> {
    const url = `${this.BACKEND_URL}/status`;
    const httpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token}`
        })
    };
    return this.http.post(url, {'token': token}, httpOptions);
}

Данные ответа представляют собой BLOB-объект Json и могут иметь код состояния 401 или 200, это код Python:

post_data = request.get_json()
post_token = post_data.get('token')

resp = User.decode_auth_token(post_token)
if not isinstance(resp, str):
    user = User.query.filter_by(id=resp).first()
    response_object = {
        'status': 'success',
        'data': {
            'user_id': user.id,
            'email': user.email.lower(),
            'first_name': user.first_name,
            'last_name': user.last_name,
            'admin': user.admin,
            'registered_on': user.registered_on
        }
    }
    return make_response(jsonify(response_object)), 200

response_object = {
    'status': 'fail',
    'message': resp
}
return make_response(jsonify(response_object)), 401

В настоящее время у меня есть этот код, который не работает с ERROR Error: Uncaught (in promise): HttpErrorResponse, когда код состояния 401:

@Injectable()
export class EnsureAuthenticated implements CanActivate {
    constructor(private auth: AuthService, private router: Router) {}
    canActivate(): Observable<boolean> {
        console.log('AUTH');
        return this.auth.currentUser(localStorage.getItem('token')).pipe(map(suc => {
            if (suc.status = 'success') {
                return true;
            } else {
                this.router.navigateByUrl('/login');
                return false;
            }
        }));
    }
}

Я использую угловой 7.0.4.

1 Ответ

0 голосов
/ 31 января 2019

Ответ состоял в том, чтобы поймать ошибку, используя catchError:

import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { AuthService } from './auth.service';
import {Observable, of} from 'rxjs';
import {catchError, map} from 'rxjs/operators';
import {HttpErrorResponse} from '@angular/common/http';

@Injectable()
export class EnsureAuthenticated implements CanActivate {
    constructor(private auth: AuthService, private router: Router) {}
    canActivate(): Observable<boolean> {
        return this.auth.currentUser(localStorage.getItem('token')).pipe(map(suc => {
            if (suc.status = 'success') {
                return true;
            } else {
                this.router.navigateByUrl('/login');
                return false;
            }
        }), catchError((err: HttpErrorResponse) => {
            this.router.navigateByUrl('/login');
            return of(false);
        }));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...