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()
ничего не делает
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.