Javascript 角度8拦截器-如何处理状态为200的响应 出身背景
我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然会得到状态代码200(不包括404-500,以及与实际服务器或用户连接有关的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorCode:number,message:string这不会改变 问题 使用相同的关于令牌的示例,我看到的所有关于拦截器处理无效令牌问题并在可观察对象的CatchError中刷新它的代码示例: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中刷新它的代码示例:
返回下一个.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部分。我会让你知道的,再次感谢你的回答