Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angular 6在拦截器内获取响应头_Angular_Interceptor - Fatal编程技术网

angular 6在拦截器内获取响应头

angular 6在拦截器内获取响应头,angular,interceptor,Angular,Interceptor,虽然angular 6 interceptor服务在chrome控制台网络选项卡中可用,但无法在其内部检索响应标题。我找到了许多相同的解决方案并添加了所有响应标题,但什么都没有发生。我在node.js服务器中添加了访问控制公开头 res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); res.setHeader('Access-Co

虽然angular 6 interceptor服务在chrome控制台网络选项卡中可用,但无法在其内部检索响应标题。我找到了许多相同的解决方案并添加了所有响应标题,但什么都没有发生。我在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')
我还在RESTAPI中使用
HTTPClient
模块

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;
    }
  }
});
}
服务器:

 res.setHeader('Autho','xxxxxxxxxxxxx');
像这样添加标题。
如何在拦截器中获取'Autho'头字段

我通过放置
console.log(event.headers.get('Autho'))解决了这个问题console.log(event.headers)之后的内部拦截器文件。我不知道确切的原因,但我认为angular正在进行一些延迟加载,它们只提供必要的数据,如Response body。因此,只有当我们请求一些数据,如使用
get('Autho')
时,它们才会提供这些数据

更新的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;
    }
  }
});
}
intercept(请求:HttpRequest,下一步:HttpHandler):可观察{
const token=sessionStorage.getItem('data');
const id=sessionStorage.getItem('id');
常量re='/login';
//如果(!令牌)
log(request.url);
//log(新的URL(request.URL).searchParams.get('userId');
if(request.url.search(re)=-1){
request=request.clone({
集合标题:{
授权:令牌,
身份:id
}
});
}
返回next.handle(request).do((事件:HttpEvent)=>{
console.log(事件);
if(HttpResponse的事件实例){
//如果你想的话,做一些有回应的事情
日志(event.headers);
const jwt=event.headers.get('Autho');
控制台日志(jwt);
//console.log(response.headers);
//log(HttpResponse.Headers);
}
},(错误:任何)=>{
if(HttpErrorResponse的错误实例){
控制台日志(err);
如果(错误状态===400){
//重定向到登录路径
//或显示模态
console.log('ERROR');
window.location.href=this.messageService.API_ROOT;
}
}
});
}

我遇到了同样的问题,这篇文章是谷歌的第一篇回复,但没有包含我认为正确的答案。不知道OP是如何让它与他们的解决方案一起工作的。事实证明,由于HttpClient使用的是XmlHttpRequest,因此需要有一个“控制”头,以允许angular看到Chrome Network可以看到的头。这篇文章的详细内容如下:

我将它添加到我的express后端,一切都如预期的那样工作(我正在做一件与@Subham尝试的事情非常相似的事情)

这是Angular 9.0.4

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;
    }
  }
});
}