Angular 4.3

时间:2017-10-20 11:04:33

标签: angular typescript rxjs

我正在尝试使用HttpInterceptor编写我的第一个代码来捕获401错误。我想要做的是根据条件创建一个新的身份验证令牌然后重试。但是目前我的代码进行了重试,但它是在创建新的身份验证令牌之前完成的。这是我的代码:

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

我仍然熟悉Typescript语法,我想我只需要在创建新令牌后进行重试,但我不确定这种情况下的确切语法。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

抱歉,我无法在评论中回复。 我想这就是链接Observable。

基本上,您在上一次return next.handle(request);之前调用的所有内容都会在进行http调用之前得到处理。 除了this._refreshTokenService.getRefreshToken(refreshToken).subsribe()内的所有内容都将被异步处理。

你应该像这样链接你的Observable:

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