gpt4 book ai didi

Angular2 Http 拦截器在子模块中不起作用

转载 作者:太空狗 更新时间:2023-10-29 17:25:55 25 4
gpt4 key购买 nike

所以我创建了一个 angular2 模块来处理 HTTP 拦截,使用像这样的基本拦截器:

@Injectable()
export class RequestInterceptor implements HttpInterceptor {
constructor(private injector: Injector) {}

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authService = this.injector.get(AuthService);
if(authService.isAuthenticated()){
const authReq = request.clone({
setHeaders: {
Authorization: `Bearer ${authService.getAccessToken()}`
}
});
let handle = next.handle(authReq).do(event => {
if(event instanceof HttpResponse){
if(event.headers.has('Authorization')){
authService.updateToken(event.headers.get('Authorization').split(' ')[1]);
}
}
});
return handle;
}else{
return next.handle(request);
}
}
}

这将向 http 请求添加一个授权 header ,并在从服务器发送新 header 时更新其自己的 header 。它的导入和提供通常是这样的:

{
provide: HTTP_INTERCEPTORS,
useClass: RequestInterceptor,
multi: true
},

所以 auth angular2 模块被编译并导入到我的 app.module.t 中,它工作得很好。直到我尝试从子模块中使用它。这里的最佳答案:Inherit imports from parent module to child module in Angular2声称 angular2 不会让你让整个应用程序全局可用。这样对吗?

我通过导入 RequestInterceptor 并在模块的提供程序中设置它来从子模块开始工作,但我宁愿不必这样做以减少使用起来的麻烦。

最佳答案

不是最佳答案 - 但请查看此错误:https://github.com/angular/angular/issues/20575

特别是这样的评论:

You should import the HttpClientModule only once, see docs

我想您正在模块树中的某处重新导入 HttpClientModule - 可能在另一个子模块中。如果您只在 AppModule 中声明一次(如果它是导入的,则声明一次)然后它应该开始在所有地方工作。无论如何,那是我的经历。

当另一个开发人员稍后将它导入到 ChildModule 中并且没有意识到拦截逻辑不再工作时,这种情况很糟糕 - 并且感觉已经成熟导致错误。但事实似乎就是这样。

关于Angular2 Http 拦截器在子模块中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48756792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com