forkJoin не передает статус 401 как ошибку в MEAN-приложении - PullRequest
0 голосов
/ 01 февраля 2019

В моем MEAN-приложении я использую forkJoin в Angular 6 для последовательных звонков на мой сервер.

Всякий раз, когда при запросе данных возникает ошибка, я передаю статус 401 вместе с объектом ошибки.

Я подписываюсь на запросы, но функция error не запускается.Только функция data запускается с объектом ошибки.

Вот мой код:

Код TS файла

forkJoin(
      this.http.post(url1, obj1).pipe(map((res:Response) => res)),
      this.http.post(url2, obj2).pipe(map((res:Response) => res))
  ).subscribe(
    data => {

      console.log('Data Called');

    },
    error => {

      console.log('Error Called');


    });

Код NodeJS:

res.status(401).send({ error: "error", message: "Oops! Please try again" });
res.end();

1 Ответ

0 голосов
/ 01 февраля 2019

Прежде всего, вы хотите вызывать вещи последовательно, вы не должны использовать forkJoin, он будет запускать все запросы одновременно, а затем ждать, пока все они завершатся.Если вы хотите вызывать их по одному, используйте concat

import { concat } from 'rxjs/operators';
import { of } from 'rxjs';    

//emits 1,2,3
const sourceOne = of(1, 2, 3);
//emits 4,5,6
const sourceTwo = of(4, 5, 6);

//used as static
const example = concat(sourceOne, sourceTwo);

Но помимо этого.Ваш вопрос, почему метод ошибки не срабатывает.И это потому, что цепочка наблюдателей разрушается в тот момент, когда ошибка выдается где-то в середине обработки.Если вы хотите защитить себя от этого, вы должны кэшировать его либо на проблемной наблюдаемой.

forkJoin(
      this.http.post(url1, obj1).pipe(map((res:Response) => res)).pipe(catchError(val => of('I caught: ${val}'))),
      this.http.post(url2, obj2).pipe(map((res:Response) => res)).pipe(catchError(val => of('I caught: ${val}')))
  ).subscribe(
    data => {
      console.log('Data Called');
    },
    error => {
      console.log('Error Called');
    });

Или второй вариант - кэшировать его.Но тогда вы ничего не получите, если одна из наблюдаемых выдает ошибку.

forkJoin(
          this.http.post(url1, obj1).pipe(map((res:Response) => res)),
          this.http.post(url2, obj2).pipe(map((res:Response) => res))
      )
.pipe(catchError(val => of('I caught: ${val}')))
.subscribe(
        data => {
          console.log('Data Called');
        },
        error => {
          console.log('Error Called');
        });

В документации ясно сказано так же: https://www.learnrxjs.io/operators/combination/forkjoin.html

...