У меня есть конечная точка 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 в перехватчике решило эту проблему.