0

我想在我的 Angular 应用程序中创建或多或少的通用错误处理程序。

例如,我收到一封带有此链接的邮件:mysite/messages/151 单击此邮件:如果我没有登录,我的框架会返回 403(故意)。

所以我创建了这个工厂。目前它只查找 403 错误,然后将用户路由到登录页面。

app.factory('httpRequestInterceptor', ['$q', '$location', '$rootScope', function($q, $location) {

    return {
        'responseError': function(rejection) {
            if (rejection.status === 403) {

                $location.path('/user/login');
                return $q.reject(rejection);
            }
        }
    };
}]);

在 app.config 我添加了这一行:

app.config(['$httpProvider', function($httpProvider)
{

    $httpProvider.interceptors.push('httpRequestInterceptor');

现在,当我得到一个 403 时,我走的是正确的路径:/user/login 到目前为止,一切都很好。

但是...我想以某种方式添加 $state,这样我就知道调用 url 是什么(messages/151),这样我就可以返回正确的位置并显示消息。

我不能在工厂中使用 $state(由于一些我还不了解的技术问题($http vs $state?)而出错,所以现在我很困惑如何完成这些事情。

所以,我想要:

1)在 URL 上出现 403 错误进入登录状态(有效)

2)从用户(作品)获取登录凭据

3)登录后转到网址是可以的(不是线索)

也许我应该使用另一种方法,但我无法理解它。所以希望有人可以帮助我吗?

4

2 回答 2

1

好的,这就是我想出的。谢谢!

/**
 * Error handling on httpRequests.
 *
 * generic: use rejection.status like: if (rejection.status === 403) {return     $q.reject(rejection);}
 * custom:  check fromState['current']['name'] for state name
 *
*/
app.factory('httpRequestInterceptor', ['$q', '$location', '$injector', '$timeout', '$stateParams', function($q, $location, $injector, $timeout, $stateParams) {

    return {
        'responseError': function(rejection) {
            var fromState = $injector.get('$state');

            $timeout(function() {
                switch (fromState['current']['name']) {
                    case 'root.messages':
                        $injector.get('$state').go('root.login', $stateParams,
                                {location: false});

                        break;
                }
            }, 2000);
            return $q.reject(rejection);
        }
    };
}]);
于 2014-08-14T14:33:17.560 回答
0

广播方法很好,但我们也可以通过以下方式做到这一点。如果您使用 ui-router 来处理路由请求,那么您可以使用:n 您的授权服务:

// There is a positive point to use this, your router will not get loaded before authorization
// $stateChangeStart call before routing to other state

rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
    if(!session.exists()){
        // Unauthorize User
        event.preventDefault();
        state.go("error");
    }else{
        // Normal Flow
        location.path(toState.url);
    }
});
于 2014-08-12T16:08:31.817 回答