Angular 8 перехват 401 с модальным входом

Я пытаюсь заставить пользователя продолжить с того места, где они остановились, вводя данные для входа из любого места в приложении, однако у меня нет токена или токена обновления, серверная часть использует session cookie.

Вот что я до сих пор безуспешно пытаюсь сделать, используя HttpInterceptor, когда ответ 401, я показываю модальный using ngx-bootstrap modal service.

Вышеупомянутая часть относительно работает, теперь я не уверен, как заставить service/intercept запросить тот же запрос, который не удался.

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

Любые идеи или примеры были бы замечательными.


Обновление: я все еще не могу заставить его работать retryWhen не помогло

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).pipe(
      retryWhen(errors =>
        errors.pipe(
          tap(errorStatus => {
            let OrgReq;
            console.log("tap: ", errorStatus);
            if (errorStatus.status === 401) {
              OrgReq = req.clone();
              this.authModalRef = this.modalService.show(AuthenticationComponent, this.initialState);  
              this.authModalRef.content.onLoggedIn.subscribe(loggedIn => {
                    console.log("has logged? ", loggedIn, OrgReq);
                    return next.handle(OrgReq);
                });
            }

            throw errorStatus;

          })
        )
      )
  );
}

Я думаю, потому что первый запрос, отписанный после 401, next.handle() ничего не делает


person et3rnal    schedule 04.10.2019    source источник
comment
Подписавшись на next.handle(OrgReq), я заставил его выполнить его после входа в систему, однако компонент, который запустил запрос, не знает, поскольку его запрос уже отписался с 401. Предполагается, что это работает так? я могу заставить его продолжить?   -  person et3rnal    schedule 09.10.2019


Ответы (1)


Я думаю, что повторить попытку, когда оператор трубы сделает за вас трюк

https://www.learnrxjs.io/operators/error_handling/retrywhen.html

Что-то вроде этого:

intercept(req: HttpRequest, next: HttpHandler): Observable<HttpEvent<any>> {

        let clone = req.clone()

        return next.handle(clone).pipe(

            retryWhen(err => {
                // You can filter based on the error
                const retryReq = confirm("Retry");
                if(retryReq)return next.handle(clone)
                else return OtherObservable
            })
        );
    }
}

Вам нужно возвращать Observable, всегда либо true, либо false.

person Robert garcia    schedule 04.10.2019
comment
Спасибо, я обновил ответ тем, что я пробовал, не могли бы вы взглянуть и сказать мне, правильно ли то, что я думаю, и если да, то как предотвратить это - person et3rnal; 09.10.2019
comment
Спасибо @Robert, помогите понять, как перехватить / отловить запрос - person Camille; 13.07.2021