Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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
Javascript Ionic 2在http请求授权失败时从服务导航_Javascript_Angular_Ionic2_Rxjs - Fatal编程技术网

Javascript Ionic 2在http请求授权失败时从服务导航

Javascript Ionic 2在http请求授权失败时从服务导航,javascript,angular,ionic2,rxjs,Javascript,Angular,Ionic2,Rxjs,在我的ionic 2应用程序中,我有4个服务都发出http请求。这些服务可以从我的应用程序中的8个不同页面点击。我想处理授权令牌过期或被删除的情况,或者任何其变体。因此,如果用户点击其中一个服务,并返回401个未经授权的错误,我如何处理该错误并导航到我的登录页面,而不必在使用这些服务的所有8个页面上设置条件 重申:我希望在服务中处理请求所在的错误,并从那里导航到我的登录页面,这可能吗 有没有更好的方法来处理这个问题如有任何建议,将不胜感激 这是我想要的流程: 在任何页面上,从我的一个服务(服务

在我的ionic 2应用程序中,我有4个服务都发出http请求。这些服务可以从我的应用程序中的8个不同页面点击。我想处理授权令牌过期或被删除的情况,或者任何其变体。因此,如果用户点击其中一个服务,并返回401个未经授权的错误,我如何处理该错误并导航到我的登录页面,而不必在使用这些服务的所有8个页面上设置条件

重申:我希望在服务中处理请求所在的错误,并从那里导航到我的登录页面,这可能吗

有没有更好的方法来处理这个问题如有任何建议,将不胜感激

这是我想要的流程:

  • 在任何页面上,从我的一个服务(服务中)发出API请求
  • 如果请求返回未经授权的错误(服务中)
    • 清除用户数据(在用)
    • 导航到登录页面(服务中)
  • 否则,(假设请求成功)
    • 解析/使用我的页面中的数据(在第页中)

您可以使用拦截器检查状态代码,如果响应为401,则重定向到登录页面。我希望您一定了解拦截器的实现

angular
    .module('myProject.myModule')
    .config(['$httpProvider', function ($httpProvider) {

 $httpProvider.interceptors.push(['$q', '$location', function ($q, $location) {
        return {
            'responseError': function(response) {
                if(response.status === 401) {
                    $location.path('/login'); 
                }
                if(response.status === 200) {
                    return $q.resolve(response);
                }
                return $q.reject(response);
            }
        };
    }]);
}]);

您可以使用拦截器检查状态代码,若响应为401,则重定向到登录页面。我希望您一定了解拦截器的实现

angular
    .module('myProject.myModule')
    .config(['$httpProvider', function ($httpProvider) {

 $httpProvider.interceptors.push(['$q', '$location', function ($q, $location) {
        return {
            'responseError': function(response) {
                if(response.status === 401) {
                    $location.path('/login'); 
                }
                if(response.status === 200) {
                    return $q.resolve(response);
                }
                return $q.reject(response);
            }
        };
    }]);
}]);

您可以将回调传递给服务。我将避免尝试将导航控制器传递给服务。更干净的做法是只传递一个回调,导航到您可以在服务中使用的服务。因此,如果请求返回未经授权的错误,您可以发布一个事件(user:unauthorized),并且在app.component.ts文件中,您可以通过将用户重定向到登录页面来处理该事件。这样,您只需在服务中发布事件,并且只需在app.component.ts文件中订阅。如果您认为这样做可行,请告诉我,我可以添加一个包含更多详细信息的答案。@sebafereras这就是我最终要做的。您只需将回调传递给服务即可。我将避免尝试将导航控制器传递给服务。更干净的做法是只传递一个回调,导航到您可以在服务中使用的服务。因此,如果请求返回未经授权的错误,您可以发布一个事件(user:unauthorized),并且在app.component.ts文件中,您可以通过将用户重定向到登录页面来处理该事件。这样,您只需在服务中发布事件,并且只需在app.component.ts文件中订阅。如果你认为这可行,请告诉我,我可以添加一个更详细的答案。@sebafereras这就是我最后要做的。我必须扩展http并创建一个拦截器http工厂,才能在angular 2/ionic 2中完成这项工作。任何内置的方法都可以做到这一点吗?Id必须扩展http并创建一个interceptorHttp工厂才能在angular 2/ionic 2中实现这一点。有什么内置的方法可以做到这一点吗?