Слияние HttpHandler возврата Observable с другим в HttpInterceptor (Angular 8) - PullRequest
0 голосов
/ 04 марта 2020

Мы выполняем Angular 8. Наш API настроен таким образом, чтобы тело ответа содержало атрибут «данные» и атрибут «ошибки». Они не являются взаимоисключающими - в ответе могут быть данные и ошибки, и мы хотим и того, и другого. Мы успешно установили следующее событие Observable для отправки вложенного ответа на данные. Однако это игнорирует ошибки. Мы хотели бы обработать ошибки в вызывающем компоненте, подписавшись следующим образом

this.myService.getData.subscribe(resp => {...}, error => {...});

Это наш код перехватчика:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request)
  .pipe(map((event) => {
    if (event instanceof HttpResponse) {

      if (event.body && event.body.hasOwnProperty('data')) {
        const eventClone = event.clone({ body: event.body['data'] });
        return eventClone;
      }

      return event;
    }
  }));

}

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

1 Ответ

0 голосов
/ 04 марта 2020

В итоге я заставил это работать со следующим кодом. Вполне возможно, есть лучший способ сделать это, но вот что сработало:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request)
  .pipe(filter(e => e instanceof HttpResponse),
    switchMap(res => {
      let httpResponse: HttpResponse<any> = res as HttpResponse<any>;
      let formattedResponse = httpResponse.clone({ body: httpResponse.body['data'] })
      if (res['body'] && res['body']['errors']) {
        let errors = res['body']['errors'];
        return new Observable<HttpResponse<any>>(o => {
          o.next(formattedResponse);
          o.error(errors)
        });
      } else return new Observable<HttpResponse<any>>(o => o.next((formattedResponse)));
    }));

}

...