Ich versuche, meinen ersten Code 401 Fehler mit HttpInterceptor zu fangen. Was ich tun möchte, hängt von einer Bedingung ab, die ein neues Authentifizierungs-Token erstellt und dann erneut versucht. Aber derzeit macht mein Code die Wiederholung, aber es tut es, bevor das neue Authentifizierungs-Token erstellt wurde. Hier ist mein Code:HttpInterceptor wiederholen in Angular 4.3
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(request).catch(error => {
if (error.status === 401) {
console.log('401 error');
//check for valid refresh token
let refreshToken = localStorage.getItem('refresh_token');
this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
refreshToken => {
if (refreshToken != null) {
console.log('valid refresh token')
//if valid refresh token, relogin and create new auth token
console.log(localStorage.getItem('auth_token'));
this._userService.logout();
let email = localStorage.getItem('profile_email');
this._userService.autoLogin(email)
.subscribe(
result => {
if (result) {
console.log('new auth token created');
let auth_token = localStorage.getItem('auth_token');
//retry
request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${auth_token}`) });
}
});
}
else {
console.log('invalid refresh token');
}
});
return next.handle(request);
}
else {
console.log(error.status);
}
});
}
Ich bin immer noch vertraut mit Typoskript Syntax immer, ich glaube, ich brauche die Wiederholung nur zu machen, auftritt, nachdem die neuen Token erstellt wurden, aber ich bin mir nicht sicher über die genaue Syntax in diesem Fall. Jede Hilfe würde sehr geschätzt werden!
Hallo, vielen Dank für Ihre Antwort. Ich habe versucht, die Zeile 'return next.handle (request)' so zu verschieben, dass sie direkt hinter der Klonzeile steht, aber das gibt mir den Syntaxfehler 'Type void ist nicht dem Typ ObservableInput zuweisbar'. Ich denke, ich brauche die Return-Linie, wo ich es in meinem ursprünglichen Beitrag habe, aber wie verhindere ich, dass es ausgeführt wird, bevor der Rest des Codes ausgeführt wurde? –
user517406
Auch ich habe Ihr Beispiel versucht und es gibt Fehler 'Type Subscription ist nicht dem Typ ObservableInput zuweisbar'. Dies ist wahrscheinlich nicht so schwer zu lösen, aber die Syntax ist schwer zu verstehen :) –
user517406