2017-10-20 64 views
1

我想寫我的第一個代碼來使用HttpInterceptor來捕獲401錯誤。我想要做的是根據條件創建一個新的認證令牌,然後重試。但是,目前我的代碼會重試,但它會在創建新的身份驗證令牌之前進行重試。這裏是我的代碼:Angular 4.3中的HttpInterceptor重試

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); 
     } 
    }); 
} 

我仍然得到熟悉打字稿語法,我想我需要做出新的令牌創建後重試纔會出現,但我不知道確切的語法在這案件。任何幫助將非常感激!

回答

1

對不起,我不能回覆評論。 我想這是關於鏈接Observable。

基本上,您在最後return next.handle(request);之前調用的所有內容都會在使用http調用之前得到處理。 除this._refreshTokenService.getRefreshToken(refreshToken).subsribe()以外的所有內容都將被異步處理。

你應該鏈中的可觀察到這樣的:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> { 
    return next.handle(request).catch(error => { 
     return this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
      refreshToken => { 
       return next.handle(request); 
      } 
     ); 
    }); 
} 
+0

您好,感謝您的回覆。我試着移動'return next.handle(request)'這一行,以便它直接在克隆行之後,但是這給了我語法錯誤'Type void不能分配給類型ObservableInput '。我想我需要在原始文章中包含返回行,但是如何在代碼的其餘部分運行完之前阻止其運行? – user517406

+0

另外我嘗試了你的例子,它給出錯誤'類型訂閱不可分配類型ObservableInput '。這可能不是很難解決,但語法很難讓我的頭:) – user517406

相關問題