HTTP_INTERCEPTORS的multi:true属性是什么意思?

时间:2018-07-02 17:32:51

标签: angular angular5

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

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

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

我已经阅读了angular.io关于该属性的指南。他们解释如下:

我听不懂这部分:

  

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

这为这个概念提供了一些启示,但是我还不太了解拦截器何时注入多个值,何时不注入多个值。例如,我自己的拦截器仅更改标头。这是否意味着它只注入一个值?

谢谢

编辑:

这是我的拦截器

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
  ],

1 个答案:

答案 0 :(得分:5)

ValueProvider接口的描述中,我们可以了解multi属性:

  

如果为true,则注入器返回实例数组。这很有用   允许多个提供程序分布在多个文件中以提供   配置信息到通用令牌。

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

例如,请参见this example(这是一个示例项目),其中为令牌HTTP_INTERCEPTORS指定使用类(useClassErrorInterceptor和{{1 }}。为了使此工作正常进行,我们需要指定SecurityInterceptor,以使Angular知道将使用多个值(或类)。

multi: true

此处的重点是HTTP_INTERCEPTORS多提供商令牌。这意味着,当为此令牌提供新的值或类时,属性{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: SecurityInterceptor, multi: true }, 是必需的,并且必须将其设置为multi

请参见HttpClient文档,其中描述了如何provide an interceptor声明该部分的地方:

  

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