Angular ErrorHandler передал неверные данные

//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 ответа

Решение

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

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');
        }
    }
}

Что если вы просто позвоните 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)
        }
    }
}
Другие вопросы по тегам