2017-07-31 25 views
21

Tüm istekler için authorithation üstbilgisini ayarlamak için yeni Angular 4.3 interceptors kullanmaya çalışıyorum. Ancak, çalışmıyor. intercept interceptors içine kesme noktası belirledim ve tarayıcı isabet etmedi, bu yüzden angular sadece benim önleyicimi yok sayar gibi görünüyor. Lütfen bana yardım edin, şimdiden teşekkürler.Açısal 4.3 Interceptor çalışmıyor

user.service.ts:

import {Injectable} from '@angular/core'; 
import 'rxjs/add/operator/map'; 
import {Observable} from "rxjs"; 
import {Http} from "@angular/http"; 

@Injectable() 
export class UserService { 

    constructor(public http: Http) { 
    } 

    public getContacts(): Observable<any[]> { 
    return this.http.get('/users/contacts').map(contacts => contacts.json()); 
    } 
} 

token.interceptor.ts

import {Injectable} from '@angular/core'; 
import { 
    HttpRequest, 
    HttpHandler, 
    HttpEvent, 
    HttpInterceptor 
} from '@angular/common/http'; 
import {Observable} from 'rxjs/Observable'; 
import {AuthService} from "./shared/auth.service"; 

@Injectable() 
export class TokenInterceptor implements HttpInterceptor { 
    constructor(public auth: AuthService) { 
    } 

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 

    request = request.clone({ 
     setHeaders: { 
     Authorization: `Bearer ${this.auth.getToken()}` 
     } 
    }); 
    return next.handle(request); 
    } 
} 

app.module.ts:

@NgModule({ 
    ... 
    providers: [ 
    ... 
    {provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true} 
    ] 
}) 
+0

, bir öncekini genişleterek kendi http hizmetinizi oluşturmak gibi farklı bir yaklaşımla ilgilenirsiniz. Orada da aynısını yapabilirsin. –

cevap

40

nedeni - Eski Http servisini kullanmak Angular 4.3 - HttpClient (Http başladı) yeni hizmet yerine kullanımdan kaldırılmak). Ayrıca, HttpClient JSON yanıt türü varsayılan olarak kabul edilir, bu nedenle .map(contacts => contacts.json()) ommit gerekir.

app.module.ts

... 
import { HttpClientModule } from '@angular/common/http'; 

@NgModule({ 
imports: [ 
    HttpClientModule, 
    ... 
], 
providers: [ 
    ... 
    {provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true} 
] 
... 
}) 

user.service.ts

... 
import {HttpClient} from "@angular/common/http"; 

@Injectable() 
export class UserService { 

    constructor(public http: HttpClient) { 
    } 

    public getContacts(): Observable<any[]> { 
    return this.http.get('/users/contacts'); 
    } 
} 
18

TL; DR tüm app HttpClientModule biri ithalat olduğundan emin olun (Önermekteyiz) veya her biri için geçerli önleme yapılandırması sağlayın (yalnızca sınama için).

HttpClientModule uygulamasının farklı modüller arasında birden fazla kez alınmadığından emin olun. Tembel yüklü modüller halinde ithal ettim. Her içe aktarma, içe aktarıldığı modülden yapılan yapılandırmayı kullanarak HttpClient'in yeni bir kopyasını oluşturur, böylece bir kök modülde bulunan ara belleklerin üzerine yazılır.

+0

Günümü kurtarıyorsun! – Ismaestro

+2

Bu, açısal dokümanlarda bunun hakkında bir açıklama bulunmadığı için üzücü. SharedModule'imde HttpClientModule'yi çektim, bu nedenle önleyici modüllerimdeki önleme çağrılmadı. Umarım cevabınızı, sadece ** ** AppModule'imde HttpClientModule olduğunu beyan ederim, her şey mükemmel iş yapar –

+0

Bu bana neden bir forRoot yönteminin HttpClientModule'de olmadığını düşünmemi sağlıyor? –