【问题标题】:what does the multi: true attribute of HTTP_INTERCEPTORS mean?HTTP_INTERCEPTORS 的 multi:true 属性是什么意思?
【发布时间】:2018-12-10 23:23:01
【问题描述】:

我是 Angular 的新手,我刚刚构建了一个拦截器。根据多个教程,您必须将HTTP_INTERCEPTORS 包含在app.module 中,如下所示:

providers: [{ provide: HTTP_INTERCEPTORS, useClass: MyInterceptor, multi: true }]

我想知道multi: true 属性的含义/作用以及是否可以省略。

我已阅读有关此属性的 angular.io 指南。他们解释如下:

我不明白这部分:

注意 multi: true 选项。这个必需的设置告诉 Angular HTTP_INTERCEPTORS 是注入数组的多提供者的令牌 值,而不是单个值。

这阐明了这个概念,但我还不明白拦截器何时注入多个值,何时不注入。例如,我自己的拦截器只是更改标题。这是否意味着它只注入一个值?

这是我的拦截器

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { LoginService } from '../Services/login.service';


@Injectable()
export class JwtInterceptor implements HttpInterceptor {

    constructor(private loginService:LoginService){}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        console.log("ik zit nu in de interceptor");
        let currentUser = this.loginService.getToken();
        if (currentUser !=="") {

            request = request.clone({
                headers: new HttpHeaders({
                    'Content-Type': 'application/json', 
                    'Authorization': `Bearer ${currentUser}`
                })
            });
        }
        return next.handle(request);
    }
}

这是app.module的提供列表

  providers: [
    { provide: APP_BASE_HREF, useValue: '/' },
    { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
    { provide: 'AUTH_URL', useValue: 'http://localhost:8080/auth' },
    { provide: 'API_URL', useValue: 'http://localhost:8080/api' },
    { provide: 'HEADERS', useValue: new HttpHeaders({'Content-Type': 'application/json'}) },
    LoginGuard,
    LoginService,
    UserService,
    MessageService
  ],

【问题讨论】:

标签: angular angular5 angular-http-interceptors


【解决方案1】:

ValueProvider 接口的描述中我们可以看到multi 属性:

当为真时,injector 返回一个实例数组。这很有用 允许多个提供者分布在许多文件中以提供 配置信息到一个通用令牌。

这意味着对于我们提供一个值的令牌,将使用多个值(或类)。

例如,请参阅this example这是一个示例项目),其中指定令牌 HTTP_INTERCEPTORS 使用类 (useClass) ErrorInterceptorSecurityInterceptor。为了让它工作,我们需要指定 multi: true 以便 Angular 知道将使用多个值(或类)。

{
  provide: HTTP_INTERCEPTORS,
  useClass: ErrorInterceptor,
  multi: true
},
{
  provide: HTTP_INTERCEPTORS,
  useClass: SecurityInterceptor,
  multi: true
},

这里的一个关键点是HTTP_INTERCEPTORS 是一个multi-provider 令牌。这意味着,当为此令牌提供新值或新类时,需要属性 multi,并且必须将其设置为 true

请参阅HttpClient 文档中描述如何provide an interceptor 声明的部分:

注意multi: true 选项。这个必需的设置告诉 Angular HTTP_INTERCEPTORS 是注入数组的 multiprovider 的令牌 值,而不是单个值。

【讨论】:

  • 好的,所以当我只有一个拦截器时,我可以将 Multi 设置为 false 对吗?
  • 当我将 Multi 设置为 false 时,我收到此错误:Mixing multi and non multi provider is not possible for token InjectionToken_HTTP_INTERCEPTORS ("[ERROR -&gt;]"): in NgModule AppModule in ./AppModule@-1:-1。我不明白,因为提供者列表中没有其他拦截器。我确实提供了 APP_BASE_REF,但我不确定这是否与错误有关。它真的很奇怪。我想我最好把它变回真实。
  • @Maurice,是的,到目前为止,我从未见过向false 提供具有此属性的拦截器或省略。其他提供商则不然,您甚至可以省略此属性。看到您描述的场景(如果可能的话)会很有趣,其中一个值或类用于提供 HTTP_INTERCEPTORSmulti 为 false,不过。也许如果你有一个 github repo,放一个链接,我会看看它。
  • 请看我的开篇文章,我已经放置了拦截器并在其中提供了列表。
  • @Maurice 在 Angular 文档中深入挖掘之后,我发现在令牌 HTTP_INTERCEPTORS 的情况下,此属性是必需的,并且必须设置为 true,因为它是一个 多提供者 令牌。我更新了我的答案,请看最后一部分。
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2016-04-06
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多