角度4拦截器与ngx-restangular

时间:2017-09-15 12:16:22

标签: angular restangular

我正在使用ngx-restangular和Angular 4。

我想拦截请求,如果http状态代码为403,我想将用户重定向到登录页面。

现在我的app.module.ts

上有这段代码
/**
 * NGX-ANGULAR configs.
 */
// Function for setting the default restangular configuration
export function RestangularConfigFactory (RestangularProvider) {

  // Set base URL
  RestangularProvider.setBaseUrl('http://192.168.1.79:8080/api/');

  // If token not valid/expired
  RestangularProvider.addErrorInterceptor((response, subject, responseHandler) => {

    if (response.status === 403) {

      // Redirect user to login page
      //Router.navigateByUrl(['login']);

      return false; // error handled
    }
    return true; // error not handled
  });
}

Router.navigateByUrl(['login']);显然无效。

我尝试从Router导入@angular/router并将其注入AppModule构造函数,但无法访问this内的RestangularConfigFactory功能

任何人都可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我在试图找出同样的事情时遇到了你的问题,并且认为我会和你(以及其他任何人一起寻找)分享我的解决方案。

RestangularModule中设置imports模块时,您可以指定要传递给配置工厂的任何其他服务。就我而言,我已经通过了我的身份验证服务:

export function restangularConfigFactory(restangularProvider, auth) {
  // set base url and add token to all requests
  ...
}

@NgModule({
  ...
  imports: [
    ...
    RestangularModule.forRoot([AuthService], restangularConfigFactory)
  ],
  ...
})

所以我所要做的就是将Router添加到我的函数参数和我的服务列表中,如下所示(不要忘记import { Router } from '@angular/router';):

export function restangularConfigFactory(restangularProvider, auth, router) {
  // set base url and add token to all requests
  ...
}

@NgModule({
  ...
  imports: [
    ...
    RestangularModule.forRoot([AuthService, Router], restangularConfigFactory)
  ],
  ...
})

然后我可以像其他地方一样使用router

export function restangularConfigFactory(restangularProvider, auth, router) {
  ...
  restangularProvider.addErrorInterceptor((response, subject, responseHandler) => {
    if (response.status == 403) {
      router.navigate(['login']);
      return false;
    }
    else {
      return true;
    }
  });
  ...
}