Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ionic 3与angular 5 Http侦听器重试请求不起作用_Angular_Typescript_Ionic Framework_Ionic3_Angular Http Interceptors - Fatal编程技术网

ionic 3与angular 5 Http侦听器重试请求不起作用

ionic 3与angular 5 Http侦听器重试请求不起作用,angular,typescript,ionic-framework,ionic3,angular-http-interceptors,Angular,Typescript,Ionic Framework,Ionic3,Angular Http Interceptors,我正在使用刷新令牌进行令牌身份验证。我已经在web应用程序中成功地在angular v1中实现了身份验证和刷新令牌。在使用angular v5的ionic 3应用程序中,我也实现了该过程。它正在通过刷新令牌成功获取新令牌。但问题是,它不会再次调用最后一个请求 这是我的Http拦截器实现 @Injectable() export class HttpsRequestInterceptor implements HttpInterceptor { isRefreshingToken: boolean

我正在使用刷新令牌进行令牌身份验证。我已经在web应用程序中成功地在angular v1中实现了身份验证和刷新令牌。在使用angular v5的ionic 3应用程序中,我也实现了该过程。它正在通过刷新令牌成功获取新令牌。但问题是,它不会再次调用最后一个请求

这是我的Http拦截器实现

@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
isRefreshingToken: boolean = false;
tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);

constructor(
    private injector : Injector
) {

}

addToken(req: HttpRequest<any>, token: string): HttpRequest<any> {
    return req.clone({ setHeaders: { Authorization: 'Bearer ' + token }})
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {

    const authenticationService = this.injector.get(AuthenticationService);

    let user : AuthenticatedUser = authenticationService.getUser1();

    console.log("token", (user)? user.token : null);

    let dupReq: HttpRequest<any>;

    if (user && req.urlWithParams.indexOf("/token") < 0) {

        dupReq = this.addToken(req, user.token);

    } else {
        dupReq = req;
    }

    return next.handle(dupReq).pipe(
        tap(event => {
            if (event instanceof HttpResponse) {

            console.log(`Request for ${dupReq.urlWithParams} return status text : ${event.statusText} .`);
            }
        }, error => {
            if (error instanceof HttpErrorResponse) {
                switch ((<HttpErrorResponse>error).status) {

                    case 401:
                        return this.handle401Error(dupReq, next);
                }
            } else{
                return Observable.throw(error);
            }
        })
    )
}

handle401Error(req: HttpRequest<any>, next: HttpHandler) {

    if (this.isRefreshingToken == false) {
        this.isRefreshingToken = true;

        this.tokenSubject.next(null);

        const authenticationService = this.injector.get(AuthenticationService);

        return authenticationService.refreshToken().then((result: ResultSet) =>{

            this.isRefreshingToken = false;

            if (result.isSuccess) {

                console.log(result.message, result.model.token);

                let user: AuthenticatedUser  = result.model;
                this.tokenSubject.next(user.token);
                return next.handle(this.addToken(req, user.token));
            } 
            // TODO logout.
        }).catch((error: ResultSet) =>{
            this.isRefreshingToken = false;

            // TODO logout.
        });
    } else {
        return this.tokenSubject
                        .filter(token => token != null)
                        .take(1)
                        .switchMap(token => {
                            return next.handle(this.addToken(req, token));
                        });
    }
}};
@Injectable()
导出类HttpsRequestInterceptor实现HttpInterceptor{
isRefreshingToken:boolean=false;
tokenSubject:BehaviorSubject=新的BehaviorSubject(null);
建造师(
专用注射器:注射器
) {
}
addToken(请求:HttpRequest,标记:string):HttpRequest{
return req.clone({setHeaders:{Authorization:'Bearer'+token}})
}
截取(req:HttpRequest,next:HttpHandler):可观察{
const authenticationService=this.injector.get(authenticationService);
让用户:AuthenticatedUser=authenticationService.getUser1();
console.log(“token”,(user)?user.token:null);
让dupReq:HttpRequest;
if(user&&req.urlWithParams.indexOf(“/token”)<0){
dupReq=这个.addToken(req,user.token);
}否则{
dupReq=req;
}
返回next.handle(dupReq).pipe(
点击(事件=>{
if(HttpResponse的事件实例){
log(`Request for${dupReq.urlWithParams}返回状态文本:${event.statusText}.`);
}
},错误=>{
if(HttpErrorResponse的错误实例){
开关((错误)。状态){
案例401:
返回此.handle401Error(dupReq,next);
}
}否则{
返回可观察抛出(错误);
}
})
)
}
handle401Error(请求:HttpRequest,下一个:HttpHandler){
if(this.isRefreshingToken==false){
this.isRefreshingToken=true;
this.tokenSubject.next(null);
const authenticationService=this.injector.get(authenticationService);
返回authenticationService.refreshToken()。然后((结果:ResultSet)=>{
this.isRefreshingToken=false;
如果(结果。发布成功){
日志(result.message、result.model.token);
让用户:AuthenticatedUser=result.model;
this.tokenSubject.next(user.token);
返回next.handle(this.addToken(req,user.token));
} 
//TODO注销。
}).catch((错误:ResultSet)=>{
this.isRefreshingToken=false;
//TODO注销。
});
}否则{
返回此.tokenSubject
.filter(令牌=>令牌!=null)
.采取(1)
.switchMap(令牌=>{
返回next.handle(this.addToken(req,token));
});
}
}};
任何人都知道为什么拦截器不再重复上一个请求


谢谢

没有人知道问题出在哪里?在这种情况下,你需要重试?你有一个疯狂的rx和承诺的组合,尝试使用rx让一切变得更加明显,很难说这些承诺和rx是怎样的interacts@PareshGami在我调用refreshToken并获取新令牌之后,然后我想重试上一个http请求。您似乎在
点击
中进行了错误处理?为此,您应该使用
catchError
。。