Угловая ручка на 500 ошибок сервера - PullRequest
0 голосов
/ 02 октября 2018

Как мне изменить мой http-вызов для обработки (перехвата) 500 ошибок сервера.Я пытаюсь вызвать API, но получаю «500 (Внутренняя ошибка сервера» в части «err» функции. Я хотел бы иметь возможность перехватить его, если это возможно, но я не уверен, как. Есть простой способ сделать это?

  call_http() {
    this.http.get<any>('/api/goes/here').subscribe(data => {
      this.result = data;
    },
      err => {
        console.log(err);
      });
  }

Я не использую заголовки, карту, обработчик ошибок и т. Д. Это просто базовый вызов.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вы можете проверить код состояния http в объекте ошибки и предупредить пользователя или выполнить другое действие

call_http() {
    this.http.get<any>('/api/goes/here').subscribe(data => {
      this.result = data;
    },
      err => {
        console.log(err);
       // check error status code is 500, if so, do some action
      });
  }
0 голосов
/ 02 октября 2018

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

Это то, что мы используем в нашемприложения и в зависимости от типа ошибки: 500, 400, 404, 403, мы перенаправляем, показываем способ оплаты или просто показываем тост сообщение:

Http-коды ошибок состояния:

export class HttpError{
    static BadRequest = 400;
    static Unauthorized = 401;
    static Forbidden = 403;
    static NotFound = 404;
    static TimeOut = 408;
    static Conflict = 409;
    static InternalServerError = 500;
}

Перехватчиккод:

import {Injectable, Injector} from '@angular/core';
import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'
import {Observable} from 'rxjs/Observable';
import {AuthorizationService} from "../authorization.service/authorization.service";
import {HttpError} from "./http-error";
import {Router} from "@angular/router";
import {Toaster} from "nw-style-guide/toasts";

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
// Regular dep. injection doesn't work in HttpInterceptor due to a framework issue (as of angular@5.2.9),
// use Injector directly (don't forget to add @Injectable() decorator to class).
constructor(private _injector: Injector) {}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const logFormat = 'background: maroon; color: white';

    return next.handle(req)
        .do(event => {
        }, exception => {
            if (exception instanceof HttpErrorResponse) {
                switch (exception.status) {

                    case HttpError.BadRequest:
                        console.error('%c Bad Request 400', logFormat);
                        break;

                    case HttpError.Unauthorized:
                        console.error('%c Unauthorized 401', logFormat);
                        window.location.href = '/login' + window.location.hash;
                        break;

                    case HttpError.NotFound:
                        //show error toast message
                        console.error('%c Not Found 404', logFormat);
                        const _toaster = this._injector.get(Toaster),
                            _router = this._injector.get(Router);
                        _toaster.show({
                            message: exception.error && exception.error.message ? exception.error.message :
                                exception.statusText,
                            typeId: 'error',
                            isDismissable: true
                        });
                        _router.navigate(['']);
                        break;

                    case HttpError.TimeOut:
                        // Handled in AnalyticsExceptionHandler
                        console.error('%c TimeOut 408', logFormat);
                        break;

                    case HttpError.Forbidden:
                        console.error('%c Forbidden 403', logFormat);
                        const _authService = this._injector.get(AuthorizationService);
                        _authService.showForbiddenModal();
                        break;

                    case HttpError.InternalServerError:
                        console.error('%c big bad 500', logFormat);
                        break;
                }
            }
        });
}

}

Вам также необходимо добавить перехватчик в провайдеры @NgModule, где вы загружаете свое приложение:

    {
        provide: HTTP_INTERCEPTORS,
        useClass: ErrorInterceptor,
        multi: true
    },

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

0 голосов
/ 02 октября 2018
call_http() {
    this.http.get<any>('/api/goes/here').pipe(
      map(res => this.result = res),
      catchError(err => do something with err)
    ).subscribe();
}

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

...