Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.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
Javascript 角度8拦截器-如何处理状态为200的响应 出身背景_Javascript_Angular_Typescript_Rest_Rxjs - Fatal编程技术网

Javascript 角度8拦截器-如何处理状态为200的响应 出身背景

Javascript 角度8拦截器-如何处理状态为200的响应 出身背景,javascript,angular,typescript,rest,rxjs,Javascript,Angular,Typescript,Rest,Rxjs,我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然会得到状态代码200(不包括404-500,以及与实际服务器或用户连接有关的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorCode:number,message:string这不会改变 问题 使用相同的关于令牌的示例,我看到的所有关于拦截器处理无效令牌问题并在可观察对象的CatchError中刷新它的代码示例:

我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然会得到状态代码200(不包括404-500,以及与实际服务器或用户连接有关的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorCode:number,message:string这不会改变

问题 使用相同的关于令牌的示例,我看到的所有关于拦截器处理无效令牌问题并在可观察对象的CatchError中刷新它的代码示例:

返回下一个.handle(请求).pipe(
映射((事件:HttpEvent)=>{
}),
catchError((错误:HttpErrorResponse)=>{
}),
);
这些代码示例对我不起作用,因为正如我所说的,在我的项目中,我们在响应部分处理错误,而不是catchError。当出现无效令牌问题时,我们刷新令牌并重试失败的原始调用

如果我们在catchError中处理它会容易得多,因为它期望一个可观察到的,并且会自己处理可观察到的,但是在响应部分,它不期望一个可观察到的。。。我设法在响应部分中调用刷新令牌,并重试出现错误的http调用,但当我尝试返回有效的响应时,它从未到达第一次调用的范围


您知道如何进行刷新调用并重试catchError中的第一个http调用吗?

在这种情况下,您需要做的就是解析拦截器中的响应主体并返回

if (res.body.includes(...)) {

           throw of(new HttpErrorResponse({status: 500, statusText: 'Simulated erorr'}));

}

您可以通过
event.body.errorCode
获取响应正文。然后做你自己的逻辑。就像在我的案例中,我在响应体中获得了状态
SUCCESS
FAILURE
。我的拦截器中出现了
故障
,正在显示消息。如果
成功
,我是用subscribe方法分配数据的。现在还不清楚你想解决什么问题。您的后端总是返回200,但您使用的是
catchError
,您遇到了一个问题,它希望在某个地方可以观察到?@martin Hi martin,我知道这令人困惑,即使对我来说也很难解释,因为后端处理错误的方式我认为这不是一个好的做法。我学到的是,当你在拦截器中使用catchError时,你可以返回一个可观察的。下面来自Ivan的答案我认为它解决了我的问题,我尝试刷新令牌并重试http调用,如果我能够返回捕获中可观察到的http调用(像所有示例一样),它将被修复,但这不是我的情况,我将尝试Ivan解决方案,希望它能工作,也希望我能清除它,再次感谢您的帮助我将尝试这个,看起来它会帮我转到catchError部分。我会让你知道的,再次感谢你的回答