перехватчики удваивают запросы - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть два перехватчика HttpErrorInterceptor и AuthInterceptor.Они имеют следующий порядок:

export const httpInterceptorProviders = [
  { provide: HTTP_INTERCEPTORS, useClass: HttpErrorInterceptor, multi: true },
  { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
];

Проблема: Когда я подписываюсь на this.userService.register(), он всегда возвращает «E-mail in use», даже если регистрация прошла успешно, и яможно увидеть нового пользователя в моей базе данных.Это заставляет меня думать, что запрос выполняется дважды.Вероятно, то же самое будет и для других HTTP-запросов.

Текущий результат: Электронная почта уже используется.(двойной запрос?)

Ожидаемый результат: Успешно зарегистрирован.

Результат, когда я удалил HttpErrorInterceptor из провайдеров:

Тобыл ожидаемый, но "ОШИБКА"?

ERROR 
{…}
error: Object { error: SyntaxError, text: "Successfully registered." }
headers: Object { normalizedNames: Map(0), lazyUpdate: null, lazyInit: lazyInit() }
message: "Http failure during parsing for http://localhost:5000/api/users"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:5000/api/users"
<prototype>: Object { … }
core.js:6014:19

Результат, когда я удалил AuthInterceptor из провайдеров:

Проблема осталась здесь.

ERROR 
{…}
error: "E-mail already in use."
headers: Object { normalizedNames: Map(0), lazyUpdate: null, lazyInit: lazyInit() }
message: "Http failure response for http://localhost:5000/api/users: 400 Bad Request"
name: "HttpErrorResponse"
ok: false
status: 400
statusText: "Bad Request"
url: "http://localhost:5000/api/users"
<prototype>: Object { … }
core.js:6014:19

Во-первых, это не бэкэнд, потому что я тестировал его с NSwag и Postman.Там все отлично работает.Оба провайдера добавляются в app.module.ts, а не в модуль с отложенной загрузкой, так как в stackoverflow возникали похожие проблемы.

Мое объяснение состоит в том, что оба перехватчика обрабатывают один и тот же запрос одновременно, каким-то образом, даже еслиthis.userService.register() вызывается только один раз (подтверждается console.log).

Я не знаю, как это решить, но он исходит от HttpErrorInterceptor.Я думал об использовании HttpBackend, но мне действительно нужны эти модалы из HttpErrorInterceptor для проверки ошибок.

Есть идеи?

https://stackblitz.com/edit/angular-dziwbx

http-error.interceptor.тс

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';

import { HttpErrorHandlerService } from './http-error-handler.service';

@Injectable({ providedIn: 'root' })
export class HttpErrorInterceptor implements HttpInterceptor {
  constructor(private errorHandler: HttpErrorHandlerService) { }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log(request);

    return next.handle(request)
      .pipe(
        // retry once before checking the error status
        retry(1),
        catchError((error: HttpErrorResponse) => {
          this.errorHandler.handle(error);
          return throwError(error);
        })
      );
  }
}

1 Ответ

1 голос
/ 19 сентября 2019

У вашего перехватчика retry(1), поэтому они делают дубликаты запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...