как сделать угловой ответ на http 401 - PullRequest
0 голосов
/ 19 июня 2019

У меня есть nodejs (экспресс) в качестве стороны сервера и угловой 6 в качестве клиента. На сервере у меня есть функция промежуточного уровня одежды, которая выполняет проверку сеанса.В случае, если сеанс является недействительным или не существует, я хотел бы отправить ответ клиенту, чтобы он мог реагировать на него.Я подумал о том, чтобы вернуть код ответа 401 с сервера и создать в клиенте своего рода слушатель \ route-guard \ HttpInterceptor, чтобы он мог управлять ситуацией на клиенте (например, перенаправить его на страницу входа),Вот мой код на сервере:

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

Как мне отловить \ прослушать этот ответ в угловом приложении?

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Вы можете создать 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 docs или angular.io guide

2 голосов
/ 19 июня 2019

При нажатии 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
     });
}
0 голосов
/ 19 июня 2019

Если вы используете Angular Js, вы можете попробовать это

Угловой код Js

$http.get(url).then(function(response){
  console.log(response.status); //successful status like OK
}, function(response){
  console.log(response.status); //error status like 400-Bad Request
})

response.status это даст вам код состояния.

Если вы используете Angular 2 или выше, вы можете попробовать это

Угловой 2 / Высший код

sendForgotPass() {
 return this.service.postForgotPass(this.emailFormControl.value)
    .subscribe(
      res => {
        console.log(res.status);
      })
    }

res.status это даст код состояния

...