Невозможно обработать HTTP / 404 при вызове httpClient.delete () в Angular 8 - PullRequest
1 голос
/ 11 октября 2019

У меня есть конечная точка Springboot 2.1, которая возвращает HTTP / 404 при вызове метода DELETE. Существует приложение Angular 8, которое вызывает эту конечную точку с помощью HttpClient. Он был сокращен до самого простого кода.

Если я позвоню httpClient.delete ('url'). Subscribe (); , в то время как бэкэнд вернет HTTP / 404, я не могу обработатьошибки. Angular выдает эту ошибку в консоли: ОШИБКА TypeError: Вы указали 'undefined', где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable.

Я пытался обрабатывать ошибки, как написано в описании Angular http-клиента, но это не помогает. Перед вызовом любого кода обработки ошибок Angular выдает ошибку в консоли, и обработка ошибок не выполняется.

Вот код Java

@RestController
@RequestMapping("/api/test")
@RequiredArgsConstructor
class TestController {

  @DeleteMapping("/{id}")
  public ResponseEntity deleteObject(@PathVariable("id") Long id) {
    return ResponseEntity.notFound().build();
  }
}

Угловой код, вызывающий эту конечную точку:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ObjectsService {

  constructor(private httpClient: HttpClient) {
  }

  deleteObject() {
    return this.httpClient.delete('http://localhost:8090/api/test/5').subscribe();
  }
}

Chrome показывает, что ответ таков:

Request URL: http://localhost:8090/api/test/5
Request Method: DELETE
Status Code: 404 
Remote Address: [::1]:8090
Referrer Policy: no-referrer-when-downgrade

К сожалению, вместо нормального выполнения в консоли появляется ошибка:

ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:27)
    at subscribeToResult (subscribeToResult.js:11)
    at CatchSubscriber.error (catchError.js:38)
    at XMLHttpRequest.onLoad (http.js:2476)
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:39679)
    at ZoneDelegate.invokeTask (zone-evergreen.js:390)
    at Zone.runTask (zone-evergreen.js:168)
    at ZoneTask.invokeTask [as invoke] (zone-evergreen.js:465)
    at invokeTask (zone-evergreen.js:1603)

edit: есть такжеHTTPInterceptor, который обрабатывал ошибки:

  private handleErrors(err: HttpErrorResponse): Observable<any> {
    if (err.status === 401) {
      this.loginService.redirectToUrl = this.router.url;
      this.router.navigate(['/login']);
      return of(err.message);
    }
  }

Благодаря @igor было обнаружено «пропущенное еще». Добавление обработки HTTP / 404 в перехватчике решило эту проблему.

Ответы [ 4 ]

1 голос
/ 11 октября 2019

Обобщенный обработчик ошибок для обработки ошибок был бы идеальным решением, если вам необходимо обрабатывать ошибки из всех вызовов API.

https://angular.io/api/core/ErrorHandler

Для получения более подробной информациина обработчике ошибок и перехватчиках,

в чем разница между обработчиком ошибок и перехватчиком в угловых 2?

1 голос
/ 11 октября 2019

Вам нужно передать аргумент в subscribe (), который будет ответом. В вашем примере

deleteObject() {
  return this.httpClient.delete('http://localhost:8090/api/test/5').subscribe(response => {
    // Here you will handle response
  }, (error) => {
    // Here you can handle errors
  });
}
0 голосов
/ 11 октября 2019

Хорошее начало, я бы сказал, - реализовать перехватчик и обработать эти ошибки:

@Injectable()
export class ServiceHttpInterceptor implements HttpInterceptor {

 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
   ...........
   next.handle(req)
            .pipe(tap(event => {
                if (event instanceof HttpResponse) {
                  // doNothing now
                }
            }))
            .pipe(catchError(err => {
                      if (err instanceof HttpErrorResponse) {
                          // Handle your 404 here
                          }
           }
}

}
0 голосов
/ 11 октября 2019

Если код обработки ошибок, выполняемый на наблюдаемой, не достигается, то у вас настроен HttpInterceptor, который обрабатывает ошибку до того, как этот код будет достигнут.

...