【问题标题】:how to make angular response to http 401如何对 http 401 做出角度响应
【发布时间】:2019-06-21 19:48:17
【问题描述】:

我有一个 nodejs (express) 作为服务器端,一个 angular 6 作为客户端。在服务器中,我有一个中间件功能,可以进行会话检查。如果会话无效或不存在,我想向客户端发送响应,以便它可以对其做出反应。我想从服务器返回一个 401 的响应代码,并在客户端制作某种 listener\route-guard\HttpInterceptor,这样 - 它可以管理客户端中的情况(例如,将其重定向到登录页面) . 这是我在服务器中的代码:

router.use('/', (req, res, next) =>
{
    if (!req.session.user)
    {
        res.status(401);
    }
    else{
        next();
    }
})

如何在 Angular 应用程序中捕捉\收听此响应?

【问题讨论】:

  • 您有客户的请求代码吗?
  • 虽然你用的是Angular,但这跟没关系,所以我把标签去掉了。考虑添加nodeexpress 等标签。
  • @Maryannah,他问“我怎样才能在 Angular 应用程序中捕捉\收听这个响应?”我相信他在问一个与角度相关的问题。
  • @Riv 我的错,我专注于I would like to send a response to the client so that it can react to it。我正在添加标签,您的解决方案是here
  • 如果您谈论的是 401 HTTP 错误,那么我想您希望您的用户在其任何请求引发 401 时重定向到登录页面。如果是这种情况,我建议您看看 HttpInterceptor 接口,当然还有 RxJS catchError

标签: angular angular-router angular-guards


【解决方案1】:

您可以创建一个HttpInterceptor,您可以在其中检查状态是否为 401,如果是,则注销用户并重定向到登录页面。 HttpInterceptor 所做的是拦截每个请求和响应,并允许您执行一些特定操作,例如检查 servce 是否返回 401 状态。但是请注意 range 对于 interceptor 它的工作方式与 services 类似,因此如果您将其包含在顶级模块中,那么它将拦截每个请求和响应

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    constructor( 
       private authService: AuthService
    ) { }
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(request).pipe(
            map((event: HttpEvent<any>) => event), // pass further respone
            catchError((error: HttpErrorResponse) => {
                // here will be catched error from response, just check if its 401
                if (error && error.status == 401)
                    // then logout e.g. this.authService.logout()
                return throwError(error);
            }));
    }
}

然后将其包含在提供者部分的app.httpmodule

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

angular.io docsangular.io guide 了解更多信息

【讨论】:

  • Patryk Brejdak - 这对我来说是完美的解决方案,正是我想要的!
  • 我很高兴听到这个消息。
  • 尝试了来自其他 Stack Answers 和一些博客站点的几个拦截器,但这是第一个有效的。谢谢大佬!
【解决方案2】:

当您点击 http 调用时,会出现两个参数。 第一:成功回调。第二:错误回调。

例如,如果我们有一个名为api 的服务,下面将是完整的代码:

如果需要捕获服务中的错误:

 getData(){ 
  this._http.get(url).map((response: Response) =>{
     return response.json();    
   })
     .catch(this.handelError) 
}

handelError(error: Response){
   console.log('got below error from server',error);
}

如果需要在组件中捕获错误:

 someMethod(){

    this._apiService.getData().susbscribe((result)=>{
         console.log('sucess',result);
        // do further processing
    },(error)=>{
        console.log('error from service',error);
        // do further processing
     });
}

【讨论】:

  • 这是基本的方法和行为 - 我一直在寻找一种具有单点治疗的解决方案 - 这是因为它与 http 401(未授权)错误相关,该错误与对服务器的每个请求。请参阅 Patryk Brejdak 的答案 - 这是完美的
  • @Guy E 很难通过查看您在问题中提供的信息量来准确理解您想要什么。不过很高兴您的问题得到解决。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2017-07-02
  • 2019-05-23
  • 2019-03-14
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多