angular - Angular 12/rxjs 7/angularfire:不推荐使用 toPromise 的异步令牌拦截器
问题描述
我正在使用 angularfire 和身份验证拦截器,为每个请求添加一个令牌。此拦截器需要异步调用,因为令牌可能需要刷新。
随着 rxjs 7 的更新,我的 async tokenHandler 现在面临两个问题:
- .toPromise() 已废弃
- 异步 tokenHandler 可能返回 undefined(类型 'HttpEvent | undefined' 不可分配给类型 'HttpEvent')
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private auth: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const fireUser = this.auth.fireAuthUser.value;
if (fireUser) {
// convert promise to observable using 'from' operator
return from(this.tokenHandler(request, next, fireUser));
}
return next.handle(request);
}
async tokenHandler(request: HttpRequest<any>, next: HttpHandler, currentUser: firebase.User): Promise<HttpEvent<any>> {
const authToken = await currentUser.getIdToken().then();
if (authToken) {
request = request.clone({ setHeaders: { Authorization: 'Bearer ' + authToken } });
}
return next.handle(request).toPromise();
}
}
你能告诉我如何重写异步 tokenHandler 吗?
解决方案
stream$.toPromise()
在语义上与 new 最相似,lastValueFrom(stream$)
除了:
toPromise 的类型信息错误。
当源 Observable 完成而没有发出单个值时 - 它以 undefined 解析。在这种情况下它应该拒绝,但事实并非如此。在这种情况下,lastValueFrom 和 firstValueFrom 都将被拒绝。
因此,您可以使用lastValueFrom
或解决此问题firstValueFrom
。
async tokenHandler(
request: HttpRequest<any>,
next: HttpHandler,
currentUser: firebase.User
): Promise<HttpEvent<any>> {
const authToken = await currentUser.getIdToken();
if (authToken) {
request = request.clone({ setHeaders: { Authorization: 'Bearer ' + authToken } });
}
return lastValueFrom(next.handle(request));
}
推荐阅读
- spring-boot - Spring Boot中JSP页面中如何使用模型和视图addObject?
- python - 从 ArcMap 10.8 的 Python 窗口中的不同文件夹调用脚本
- powerbi - 在power bi中如何使用自定义模板更改表格列标题(可视表格标题)我正在尝试这个但不工作
- ios - iOS 上的 Ionic App 构建失败。Firebase 使用未声明的标识符“FIRInstanceID”
- image - 我可以将 smallbasic 图形窗口的背景更改为图像吗?
- android - 如何在android的日期选择器editTextView中启用键盘中的下一个选项?
- react-native - React Native 如何将多个图像上传到服务器(后端)
- python - Tensorflow ValueError:尺寸必须相等:LSTM + MDN
- javascript - 导航栏未在移动视图中显示
- java - 按哈希映射的值(按映射的值比较)对哈希映射的数组列表进行排序