angular - Angular HttpInterceptor - 参数类型不可分配
问题描述
我想创建自定义 HttpInterceptor 来验证 HttpResponse 是否具有状态 403 - 如果是,则向用户显示一个监视器。根据一些教程,我编写了以下代码:
@Injectable()
export class 403HttpInterceptor implements HttpInterceptor{
constructor(){}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>{
return next.handle(request).pipe(
catchError((err:HttpErrorResponse)=>{
if(err.status === 403){
//display monit
}
return throwError(err);
})
);
}
}
然而仍然得到
参数类型 (err:HttpErrorResponse) => Observable 不可分配给参数类型 (err:any, caught:Observable)=>never
使用 Angular 7.2.10 和 rxjs 6.4.0
解决方案
基于 Nicola 的回答,我想解释一下发生了什么。
您的代码现在需要返回一个 observable,它只是 next.handle() 返回。它也不能返回其他东西。因此,按照您编写的方式,catchError 也将返回该错误的可观察值。这就是 throwError 所做的。它来自 rxjs,是一种将错误转化为该错误的 Observable 的方法。
所以删除返回是这里的关键,因为你想处理错误,而不是返回它。
return next.handle(request)
.pipe(
catchError((err: any) => {
throw new Error(err);
}),
);
推荐阅读
- apache-kafka - 最新(版本:Fishtown.SR2)spring-cloud-stream不支持kafka客户端2.1.0或更高版本?
- dart - Sqlite 数据库集成给出错误
- oracle - 如何在apex18.2的模型对话页面中删除x按钮
- ruby-on-rails - 哈希中的 Sort_by - 反转或不反转 - 如何?
- android - 该视图不是 CoordinatorLayout 的子视图
- delphi - 获取 Web 服务以使用证书
- java - 如何使用 TestNG 在两个不同的浏览器中并行运行两种测试方法?
- javascript - 单击其他页面上的按钮响应时?
- amazon-web-services - 构建项目时出现 AWS CodeBuild 错误 => YAML_FILE_ERROR 消息:此构建映像不支持运行时版本选择
- rust - 如何在过程宏中确定编译属性?