2017-10-20 65 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

相关问题