javascript - 如何从 Observable 中检索数据并在 Interceptor 中使用它?
问题描述
我正在构建应用程序的前端Angular 8
。此应用程序使用OAuth 2
实现来管理身份验证(密码授予),因此任何HTTP
请求(对令牌端点的请求除外)都需要在其标头上具有有效的 access_token。
为了提供所述令牌,我制作了一个Angular interceptor
从另一个服务检索令牌,然后将其附加到截获的HTTP
请求。令牌检索方法不直接给出令牌,而是最终解析为有效令牌的可观察对象,我做出此选择是因为访问令牌可能不会立即可用,如果令牌过期,应用程序需要通过HTTP
调用刷新它然后可以将刷新的令牌传递给HTTP
拦截器。
我遇到的问题是,尽管我进行了多次尝试,但拦截器并没有等待检索令牌,所以最后拦截器被跳过并且HTTP
请求是在没有附加任何令牌的情况下发出的。
这是我的拦截器的代码,retrieveValidToken
是Observable
返回令牌的代码。
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { FacadeService } from './facade.service';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {
constructor(private facadeService: FacadeService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url.includes('localhost:3000') && !req.url.endsWith('token')) {
this.facadeService.retrieveValidToken()
.subscribe(
(res) => {
const clone = req.clone({ setHeaders: { Authorization: `Bearer ${res}` } });
return next.handle(clone);
},
(err) => {
const clone = req.clone({ setHeaders: { Authorization: `Bearer ` } });
return next.handle(clone);
}
);
} else {
return next.handle(req);
}
}
}
解决方案
Observables 是异步的。subscribe 方法外面的代码不会等待里面的代码。
您应该自行返回 observable,而不仅仅是在其订阅中返回结果:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url.includes('localhost:3000') && !req.url.endsWith('token')) {
return this.facadeService.retrieveValidToken()
.subscribe(
res => {
const clone = req.clone({ setHeaders: { Authorization: `Bearer ${res}` } });
return next.handle(clone);
}
);
} else {
return next.handle(req);
}
}
相似的东西:
推荐阅读
- php - 从 __autoload 格式化为 spl_autoload_register
- javascript - JS以纯文本模式打开新窗口
- php - 无法在 nginx 中为 php/html 脚本设置背景图片
- java - 如何让 JSP 页面看起来像桌面应用程序?
- javascript - 在 Chrome Dev 中,Pause script 、 Step over 和 Step in to 选项被禁用。MAC中的工具
- adminlte - 如何使用 gtmetrix 提高 adminLTE 的性能?
- javascript - 由javascript设置的输入值在PHP的控制器中返回空
- google-sheets-formula - 带过滤器的 CountIFS
- oracle - 表的 DATE 数据类型列反映的是哪个时区?
- c - 无法运行充满数组的大型结构 win C