угловые 6 получают заголовки ответа внутри перехватчика - PullRequest
0 голосов
/ 13 февраля 2019

Не удается получить заголовки ответа внутри службы перехватчика angular 6, хотя она доступна на вкладке сети консоли Chrome. Я нашел много решений для того же и добавил все, но ничего не произошло.Я добавляю Access-Control-Expose-Headers в мой сервер node.js.

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization,Auth');
res.setHeader('Access-Control-Expose-Headers', 'Autho')

Также я использую модуль HTTPClient для остальных API.

Файл Interceptor.ts:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = sessionStorage.getItem('data');
const id = sessionStorage.getItem('id');
const re = '/login';
// if( !token)
 console.log(request.url);
// console.log(new URL(request.url).searchParams.get('userId'));

if (request.url.search(re) === -1) {
  request = request.clone({
    setHeaders: {
      Authorization: token,
      Auth: id
    }
  });
}
return next.handle(request).do((event: HttpEvent<any>) => {
  console.log(event);
  if (event instanceof HttpResponse) {
    // do stuff with response if you want
    console.log(event.headers);
    // console.log(response.headers);
    // console.log(HttpResponse.Headers);
  }
}, (err: any) => {
  if (err instanceof HttpErrorResponse) {
    console.log(err);
    if (err.status === 400) {
      // redirect to the login route
      // or show a modal
      console.log('ERROR');
      window.location.href = this.messageService.API_ROOT;
    }
  }
});
}

console.log (event.headers);ничего не печатает.

rest-api.ts:

import {Injectable} from '@angular/core';
import {HttpClient, HttpHeaders} from '@angular/common/http';


 const httpOptions = {
    headers: new HttpHeaders({'Content-Type': 'application/json'})
 };

  @Injectable({
     providedIn: 'root'
   })
 export class RestApiService {

 apiRoot = 'http://localhost:9005';

 constructor(private http: HttpClient) {
 }

  addModule(data) {
   return this.http.post(this.apiRoot + '/addModule', data, httpOptions);
 }

 getModules() {
   return this.http.get(this.apiRoot + '/getModules');
 }
}

Сервер:

 res.setHeader('Autho','xxxxxxxxxxxxx');

Добавление заголовка следующим образом.Как получить поле заголовка 'Autho' внутри перехватчика

1 Ответ

0 голосов
/ 14 февраля 2019

Я решил эту проблему, поместив console.log(event.headers.get('Autho')); в файл-перехватчик после console.log(event.headers);. Я не знаю точной причины, но я думаю, что angular выполняет некоторую ленивую загрузку, и они предоставляют только необходимые данные, такие как тело ответа.только когда мы запрашиваем некоторые данные, такие как get('Autho'), они предоставляют эти данные.

updated interceptor.ts:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = sessionStorage.getItem('data');
const id = sessionStorage.getItem('id');
const re = '/login';
// if( !token)
console.log(request.url);
// console.log(new URL(request.url).searchParams.get('userId'));

if (request.url.search(re) === -1) {
  request = request.clone({
    setHeaders: {
      Authorization: token,
      Auth: id
    }
  });
}
return next.handle(request).do((event: HttpEvent<any>) => {
  console.log(event);
  if (event instanceof HttpResponse) {
    // do stuff with response if you want
    console.log(event.headers);
    const jwt = event.headers.get('Autho');
    console.log(jwt);
    // console.log(response.headers);
    // console.log(HttpResponse.Headers);
  }
}, (err: any) => {
  if (err instanceof HttpErrorResponse) {
    console.log(err);
    if (err.status === 400) {
      // redirect to the login route
      // or show a modal
      console.log('ERROR');
      window.location.href = this.messageService.API_ROOT;
    }
  }
});
}
...