【问题标题】:Angular HttpInterceptor intercept method does not work with the first requestAngular HttpInterceptor 拦截方法不适用于第一个请求
【发布时间】:2018-08-20 10:09:16
【问题描述】:
我正在尝试使用 HttpInterceptor 拦截方法将身份验证令牌与请求中的标头一起传递。我的 _loginSvr 给出了从 GetUser() 方法返回的 Observable 中的令牌。所以当 next.handle(request) 返回时,令牌是空的。
但是在下一个 http 请求中,它可以工作,因为我猜从上一个请求中已经提取了令牌。那么我如何才能等待句柄返回reuqest,直到我得到令牌。
【问题讨论】:
标签:
angular
interceptor
identityserver4
angular-http-interceptors
【解决方案1】:
因为subscribe 是“非阻塞”的,所以在订阅方法完成之前到达return next.handle(request); 行:
你可以在这里使用 mergeMap:
import 'rxjs/add/operator/mergeMap';
...
intercept(req: HttpRequest<any>, next: HttpHandler) {
return this._loginSvr.GetUser().mergeMap(user => {
if (user.access_token) {
req = req.clone({ setHeaders: { Authorization: 'Bearer ' + user.access_token } });
}
return next.handle(req);
}
}
处理您的登录逻辑可以在 mergeMap 功能中实现。