angular - 将管道停在中间
问题描述
在我的角度应用程序中,我有一个令牌刷新拦截器,它拦截 401-未经授权的错误,尝试刷新访问令牌,并再次执行原始 http 请求。
在某些情况下,令牌刷新端点也可能会失败,并返回一个已知错误(在我的情况下是 400 invalid_grant 错误)。
刷新令牌的拦截器部分:
return this.httpClient
.request('POST', "token", { observe: 'response' })
.pipe(
map(response => {
// some logic when the token was refreshed successfully
}),
catchError(err => {
this.routingService.navigateToLoginNoQuery();
return throwError(err); // a 400 - invalid_grant error
})
);
发生这种情况时,它会到达一个 catchError 运算符,它会做两件事:注销(重定向到登录页面),并返回 throwError(error),它抛出的这个错误是 400-Invalid_grant 错误。
这会导致新错误到达最初触发刷新令牌的函数中的某些 catchError 运算符。
仅出于上下文考虑:我将错误记录在 catch 块中,并且我想避免记录此类错误,因为它们通常仅意味着用户的令牌已过期。
我想做的是以某种方式停止这个运营商链,然后重定向到登录页面。
是否可以在中间停止管道,并避免同时到达外部 catchError 和管道中的下一个运算符?
解决方案
您可以返回一个空Observable
值以防止事件或错误到达将要被销毁的组件:
return this.httpClient
.request('POST', "token", { observe: 'response' })
.pipe(
map(response => {
// some logic when the token was refreshed successfully
}),
catchError(err => {
this.routingService.navigateToLoginNoQuery();
return EMPTY;
})
);
推荐阅读
- python - 有没有办法通过 python 使用 git username-password 克隆(或下载)私有远程存储库?
- javascript - 如何使用 AJAX 调用收到的 VueJS 中的变量呈现 HTML 内容?
- mysql - 浮点值为 0.0 的 MySqlParameter
- javascript - selenium driver.execute_script 中的 Python var
- typescript - 是否可以注释一个函数来告诉打字稿编译器已经检查了类属性的类型?
- c - C中int数组的初始值 - 为什么?
- powershell - Powershell中的Outlook电子邮件ReceivedTime乱序
- sql - 如何使用 SQL 将时间划分为每小时时段(可以使用视图、存储过程或函数)
- python-3.x - 如何使用 python/selenium 根据工作簿中的值动态更新 xpath
- linq - Linq 查询抛出 NullReferenceException