3

我正在尝试运行以下代码(其中 fusseApp 是 angularModule):

fusseApp.run(function(URI, $http){

  $http.get('/check/userLogged').then(function(response){
            console.log(response);
  });

PS:实际上我的http调用是在工厂中执行的,在这里我们只是调用了这个工厂

angularModule 被模拟为:

angular.module('fusseApp.mainMocks', ['fusseApp', 'fusseApp.loginMocks', 'ngMockE2E', 'ngResource'])
    .run(function($httpBackend, $http) {

...

$httpBackend.whenGET('/check/userLogged').respond(200,response);

我的问题是 fusseApp.run 在模拟模块初始化之前执行。所以我有一个错误:

未捕获的错误:意外请求:GET /check/userLogged 不再有请求

茉莉花单元测试中似乎已经提出了这个问题,但我找不到解决方案。$http是否可以在告诉我应用程序何时完全初始化的事件之后运行我的呼叫?

我需要在屏幕上显示任何数据之前检查用户是否已通过身份验证。

4

1 回答 1

0

也许这可以帮助...

.run()如果你ng-app=""在你的代码中设置它总是被执行,它是自举过程的一部分,从那里你不能停止编译和链接过程,但是如果用户没有登录,有很多方法可以防止视图被呈现在:

A) 可以在身份验证确定后进行手动角度提升(不是那么有趣但可行),可以使用 jQuery $.ajax 或其他库,因为 $http 服务不在 NG 之外。

B)但是您.run()可以访问$rootScope所有 NG 服务,因此您可以侦听$stateChangeStart并在侦听器内部执行您的身份验证验证。

这或多或少是 NG 身份验证的最佳实践,此侦听器会在每次用户更改状态时不断检查,(这很好,以便您可以捕获会话到期),在我的代码中(我在各种项目的 prod 中使用)我这样做:

$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
    if (!AuthService.isAuthenticated()) {
        $state.transitionTo("login"); // redirect to login page
        event.preventDefault();
    }
});

AuthService只是一个简单的服务,返回true或者false用户是否通过身份验证。根据我的经验,向未经授权的用户隐藏视图并重定向的最佳解决方案是像我之前展示的那样捕获状态更改过程。因为您可以装饰状态,所以这些属性可以在toState参数中访问(至少在 ui-router 中)所以可以做各种花哨的事情,比如捕捉用户角色等等......

于 2014-11-01T04:43:47.387 回答