Angular ErrorHandler передал неверные данные - PullRequest
0 голосов
/ 25 сентября 2018
//api.service.ts
public Get(slug: string): Observable<T> {
    return this.http.get(`${environment.apiBaseURL}/${this.endPoint}/${slug}`).pipe(
        map(data => this.serializer.fromJson(data) as T)
    );
}



//global-error-handler.ts
import { Injectable, ErrorHandler } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';

@Injectable({
    providedIn: 'root'
})
export class GlobalErrorHandler implements ErrorHandler {
    handleError(error: any) {

        if (error instanceof HttpErrorResponse) {
            console.log('type is HttpErrorResponse');
        }
        else
        {
            console.log('type is Error');
        }
    }
}


//app.module.ts
{
    provide: ErrorHandler,
    useClass: GlobalErrorHandler,
}

ошибки от компонента, который имеет subscribe, возвращает error как HttpErrorResponse (что является ожидаемым типом. Однако ошибки от преобразователей возвращают error как тип Error.

Пользовательские типы ошибок теряются, когда ошибка происходит от распознавателя, и возвращают только общий тип Error.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

на основе проблемы здесь .он получает отклоненную ошибку, когда выдается ошибка из распознавателя.так что вы теряете исходную ошибку.код ниже решает проблему.

export class GlobalErrorHandler implements ErrorHandler {
    handleError(error: any) {
        error = error.rejection ? error.rejection : error; //this fixes the problem
        if (error instanceof HttpErrorResponse) {
            console.log('type is HttpErrorResponse');
        }
        else {
            console.log('type is Error');
        }
    }
}
0 голосов
/ 25 сентября 2018

Что если вы просто позвоните Get без catchError

public Get(slug: string): Observable<T> {
return this.http.get(`${environment.apiBaseURL}/${this.endPoint}/${slug}`)
    .pipe(map(data => this.serializer.fromJson(data) as T))
}

и внутри вашего глобального ErrorHandler вы обработаете все ошибки 404/500

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

    handleError(error: any): void {
        if (error.status === 404) {
             console.log('404 Error happened')
             // TODO handle error here (redirect)
        }
    }
}
...