Я пытаюсь сделать перехватчик для обновления токена пользователя, если есть ошибка аутентификации.Я спрашиваю это здесь, потому что даже с некоторыми уроками и другими вопросами я не могу сделать мои работы.
Вот моя функция перехвата:
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log('===== Intercept =====');
console.log(req);
return next.handle(req).pipe(
catchError((err: any) => {
console.log(err);
this.refreshToken().subscribe( resolve => {
console.log('RESOLVE');
// clone the original request
if (resolve) {
console.log('REQ REPEAT');
let headers = new HttpHeaders({
'Content-Type': 'application/json'
});
if (this.appState.token !== null) {
headers = headers.set('Authorization', 'Bearer ' + this.appState.token);
}
const authReqRepeat = req.clone(
{headers: headers}
);
console.log('NEW TOKEN : Bearer ' + this.appState.token);
console.log(authReqRepeat);
// resend the request
return next.handle(authReqRepeat);
} else {
return next.handle(req);
}
}, error => {
console.log('ERROR');
return throwError(error);
});
}),
);
}
Функция refreshToken возвращает мне истинноеили ложный ответ (true, если обновление в порядке).
Итак, моя первая проблема связана с заголовками запроса клона, я пробовал несколько вариантов их размещения, но в конце все еще нет заголовка в моем клонированном запросе (есть оригинальный заголовок запроса, если я не пытаюсь добавить новый).
Следующая проблема также касается запроса, когда дело доходит до next.handle
с моим новым запросом не отправляется (У меня нет журнала об этом запросе), и в мое приложение ничего не возвращается, поэтому мой компонент ждет ответа, который никогда не придет.
И третья проблема связана с catchError, у меня есть этоошибка в (err : any)
TS2345: Argument of type '(err: any) => void' is not assignable to parameter of type '(err: any, caught: Observable<HttpEvent<any>>) => ObservableInput<{}>'. Type 'void' is not assignable to type 'ObservableInput<{}>'.
Я не очень доволен наблюдаемым, но если я добавлю return throwError(error);
после моего вызова к refreshToken
, ошибка исчезнет, но у меня бесконечный цикл.