如何排除一些服务,如登录,从拦截器Angular 5,HttpClient注册

Han*_* CR 12 interceptor typescript angular angular-httpclient

我想用拦截器排除一些服务.

app.module.js

providers: [
    UserService,
    RolesService,
    {
        provide: HTTP_INTERCEPTORS,
        useClass: TokenInterceptor,
        multi: true
      },
],
Run Code Online (Sandbox Code Playgroud)

Login.service.ts

return this.httpClient.post(this.appUrl + '/oauth/token', body.toString(), { headers, observe: 'response' })
.map((res: Response) => {
  const response = res.body;
  this.storeToken(response);
  return response;
})
.catch((error: any) => {
  ErrorLogService.logError(error);
  return Observable.throw(new Error(error.status));
  });
}
Run Code Online (Sandbox Code Playgroud)

Dra*_*tor 33

虽然#Fussel的答案(上图)有效,但在每个组件模块中包含拦截器服务通常不是一个好习惯.这是反直觉和反效果的.我们希望拦截器在一个地方,并适用于所有http请求.一种方法是基于url排除intercept()函数中的头绑定.

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const re = /login/gi;
// Exclude interceptor for login request:
if (req.url.search(re) === -1 ) {
  req = req.clone({
    setHeaders: {
      Authorization: `Bearer ${localStorage.getItem('authToken')}`
    }
  });
}
return next.handle(req);
Run Code Online (Sandbox Code Playgroud)

}

  • 我不同意。我发现Fussel的答案更正确且并非直觉,因为您的答案在端点上创建了拦截器的隐藏依赖项。如果创建一个要从http拦截器范围中排除的新端点,该怎么办?我需要记住要更新HttpInterceptor。 (2认同)

Fus*_*sel 6

不仅要根据要求在评论中给出答案;-)

要从拦截器中排除某些服务(甚至在不同组件中使用的相同服务),最好将您的应用程序拆分为模块,并仅在需要时才在模块中提供拦截器。例如,登录后或在管理区域内。

甚至可以使用@Component声明的providers属性为单个组件提供拦截器。

  • 嘿 Fussel 你能提供一个例子来说明如何做到这一点吗?我尝试将拦截器导入特定模块,但似乎仍然是站点范围的。你的推荐很有趣。 (2认同)