Почему перехватчик не возвращает данные подписчику? - PullRequest
0 голосов
/ 10 ноября 2018

Я использую перехватчик в последнем Angular:

return next.handle(request).pipe(
      map((event: any) => {
        if (request.method == "GET") {
          return event;
        }

        if (request.method == "POST") {
          if (event.body) {
            return event.body["result"];
          }
        }

        return event;
      }));

Итак, я проверяю, является ли запрос POST, ожидаю получить данные из JSON с ключом result.

Также я пытался вернуть данные в Observer:

if (event.body) {
   return Observable.of(event.body["result"]);
}

А подписка это:

this.method.subscribe(res => {
    console.log(res);
});

Посмотрите на эту картинку:

console.log(event); // This is default event - first selected area 
console.log(eventToSend); /./ This is modified   - second  selected area

enter image description here

Разница - это тип HttpResponse, в нем отсутствует второй модифицированный объект eventToSend

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я решил эту проблему, используя этот подход:

return next.handle(request).pipe(
      map((event: any) => {
        if (request.method == "POST") {
          if (request.body["$type"] == "LoginRequest") {
            return event;
          }

          if (event.body) {
            event.body = event.body["result"];
          }
        }

        return event;
      }),

      catchError((error: HttpErrorResponse) => {
        if (error.status === 401) {
          this.route.navigate(["/login"]);
        }
        return throwError(
          "Ошибка сервера RequestInterception: " + error.message || error
        );
      })
    );
0 голосов
/ 10 ноября 2018

Поскольку вашему перехватчику необходимо вернуть полный event (типа Observable<HttpEvent<any>>) вместо просто ответа body, но вы все равно хотите получить только result в ответе body, попробуйте следующее:

return next.handle(request).pipe(
  map((event: any) => {
    // Removing this as it is redundant
    /*if (request.method == "GET") {
      return event;
    }*/

    if (request.method == "POST") {
      if (event.body) {
        const eventToSend = { ...event };
        eventToSend.body = event.body["result"];
        return eventToSend;
      }
    }
    return event;
  }));

Здесь мы растягиваем весь объект event, а затем переназначаем ему свойство body с помощью body['result']

Вот Образец StackBlitz для вашей ссылки.

...