延迟加载功能模块中未知的 Angular http 客户端拦截器

Posted

技术标签:

【中文标题】延迟加载功能模块中未知的 Angular http 客户端拦截器【英文标题】:Angular http client interceptors not known in lazy loaded feature module 【发布时间】:2019-04-25 09:03:30 【问题描述】:

我们在 Angular 中制作了一个拦截器。这个是通过核心模块中的 forRoot() 导出的。 app 模块使用 forRoot() 导入这个核心模块。

在延迟加载的功能模块中,拦截器是未知的。

我们如何解决这个问题?

http客户端模块在app模块中只导入一次。

【问题讨论】:

您是否提供了您的拦截器,以便它在将要使用的模块上可用? 拦截器应该用在所有模块上。它在核心模块中提供了一个forRoot方法,只有app模块导入核心模块。 我没有明白你的意思,通过使用 forRoot 提供它。 AFAIK 您应该将其提供为 提供:HTTP_INTERCEPTORS,useClass:InterceptorClass,multi:true 。另外,您是否尝试直接在 AppModule 上提供它? 我使用了 HTTP_INTERCEPTORS, multi: true... 构造。它是在 CoreModule.forRoot() 中设置的 我建议你:在 AppModule 上提供它,或者在延迟加载的模块上导入核心模块,或者将拦截器移动到共享模块并在任何需要的模块上导入它。 【参考方案1】:

你必须在每个 LazyLoaded 模块中导入你的 coreModule 才能从它的服务和组件中受益

要使您的服务单例,您需要在 AppModule 中使用 .forRoot 导入 coreModule,在每个 lazyLoaded 模块中导入不带 .forRoot,

所以如果它是你的主模块:

    @NgModule(
     imports: [
      ...
      CoreModule.forRoot()
    ],

如果是延迟加载的模块

@NgModule(
     imports: [
      ...
      CoreModule
    ],

【讨论】:

以上是关于延迟加载功能模块中未知的 Angular http 客户端拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Angular2延迟加载模块错误'找不到模块'

Angular 9 嵌套延迟加载模块,带有嵌套路由器出口

延迟加载模块中的 Angular single-spa 延迟加载路由调用未定义的 webpack 错误

Angular2 无法使用延迟模块加载的自定义重用策略

Angular:只有在授权的情况下才从服务器加载延迟加载的模块(使用 JWT)

如何使用 Angular 延迟加载模块克服加载块失败的问题