2015-12-21 55 views
0

我有一个登录页面,它将用户凭证提交给登录控制器。 但在授权用户之前,我需要“打开”一个会话并接收一个有效的sessionID。

但是,我的主要问题是处理下面调用的this.openUserSessionAPI错误事件。也就是说,我在$http.error()事件上返回了一个$q.reject(),但它并不像我所期望的那样冒泡。

这里的流量:

1)用户输入凭据并单击“登录”按钮,它调用到LoginCtrl功能loginUser()

2)我立即打电话给荷兰国际集团userService.initUserSession得到一个有效的会话ID 。

3)如果成功的话,那么调入loginService.authUser 4)如果无效的会话ID,然后我需要返回$q.reject和显示信息 “无法打开用户会话”

*****代码的细节** ***

注意,第一个我 “初始化” 在that.initRzr的应用程序,然后我打电话下面that.openUserSession

this.initUserSession = function initSession($rootScope, username) {  
 

 
var deferred = $q.defer(); 
 
deferred.notify("Establishing Session ID..."); 
 

 
$rootScope.userID = username; 
 
var that = this; 
 
this.getRazorInitParams().then(function (razorEnvJson) { 
 
\t 
 
\t that.initRzr(razorEnvJson).then(function (data) { 
 
\t \t 
 
\t \t if (data.status.match(/SUCCESS/g)) { 
 
\t \t \t 
 
\t \t \t // ******** OPEN USER SESSION *********** 
 
\t \t \t that.openUserSession(razorEnvJson).then(function (data) { 
 
\t \t \t \t // ... some code omitted here. 
 
\t \t \t \t deferred.resolve(sessionID); 
 
\t \t \t \t return sessionID; 
 
\t \t \t }); 
 
\t \t } 
 
\t }, function (error) { 
 
       // *** I NEVER HIT LINE !!! *** 
 
\t \t deferred.reject('Could not open user session.'); 
 
\t }); 
 
}); 
 
return deferred.promise; 
 
}

**** OPEN用户会话***

注:我在这里打了.error()代码,因为我可以看到控制台登录消息“无法通过API开放用户会话CAL ... ”。但是,处理似乎停止在这里,我的登录屏幕冻结与微调图标。

this.openUserSession = function (razorEnvParams) { 
 
    
 
\t // init some variables here... 
 
\t 
 
\t var url = "http://" + _domain + ":" + _port + controllerpath + "?userid=" + user + "&pass=" + pass; 
 
\t var deferred = $q.defer(); 
 
\t deferred.notify("Opening user session..."); \t 
 
\t 
 
\t $http({ 
 
\t \t method: 'GET', 
 
\t \t encoding: 'JSON', 
 
\t \t headers: { 
 
\t \t \t 'Access-Control-Allow-Origin': 'true', 
 
\t \t \t 'Content-Type': 'application/json' 
 
\t \t }, 
 
\t \t withCredentials: true, 
 
\t \t url: url 
 
\t }).success(function (data, status, headers, config) { \t \t 
 
\t \t deferred.resolve(data); 
 
\t }).error(function (data, status, headers, config) { 
 
\t \t console.log("Cannot open a user session via api call. Errors details: " + data); 
 
\t \t deferred.reject("Could not open a user session."); 
 
\t }); 
 
\t return deferred.promise; 
 
}

我会尝试,如果不清楚,以改善这个职位。请告知...

在此先感谢。

鲍勃

**** ****更新

按以下JB Nizet的回答,我缺少的that.openUserSession错误回调。我在下面添加function(error),它按预期工作。

我现在将继续推进JB发布的链接建议。

this.initUserSession = function initSession($rootScope, username) {  // ESTABLISH A RAGE CONNECTION AND SESSION ID ! 
 

 
var deferred = $q.defer(); 
 
deferred.notify("Establishing Rage Session ID..."); 
 

 
var that = this; 
 
this.getRazorInitParams().then(function (razorEnvJson) { 
 

 
\t that.initRazor(razorEnvJson).then(function (data) { 
 
\t \t 
 
\t \t if (data.status.match(/SUCCESS/g)) { 
 
\t \t \t that.openUserSession(razorEnvJson).then(function (data) { 
 
\t \t \t \t 
 
\t \t \t \t deferred.resolve(sessionID); 
 
\t \t \t \t return sessionID; 
 
\t \t \t }, function (error) { 
 
\t \t \t \t deferred.reject('Could not open user session.'); 
 
\t \t \t }); 
 
\t \t } 
 
\t }, function (error) { // **** ADDED ERROR HANDLING *** 
 
\t \t deferred.reject('Could not initial a user session.'); 
 
\t }); 
 
}); 
 
return deferred.promise; 
 
}

回答

2

openUserSession()失败,你没有为失败的任何错误回调,所以承诺永远不会得到解决,也没有拒绝。

这个错误,以及大的重叠,是由于您使用promise antipattern造成的。使用链接代替:

that.getRazorInitParams() 
    .then(that.initRzr) 
    .then(that.openUserSession) 
    .catch(function() { ... }); 

无需创建延迟并解决它。只需使用链接。例如,openUserSession()可以通过

this.openUserSession = function (razorEnvParams) { 

    var url = "http://" + _domain + ":" + _port + controllerpath; 
    return $http({ 
     method: 'POST', 
     encoding: 'JSON', 
     headers: { 
      'Access-Control-Allow-Origin': 'true', 
      'Content-Type': 'application/json' 
     }, 
     withCredentials: true, 
     url: url, 
     params: { 
      userid: user, 
      pass: pass 
     } 
    }).then(function (response) {  
     return response.data; 
    }); 
} 

也将被替换,从不使用GET传递秘密凭证:他们将结束,以纯文本格式,各种日志。并且不要连接参数。它们必须进行编码,而Angular通过使用params来完成这项工作。

+0

绝对同意re:GET请求。这仍然处于开发模式,并且安全过程很快就会彻底改变。如上所述 –

+0

。我没有回拨。它现在可以工作,我已经添加了'function(error)'到'that.openUserSession'。我也将继续重新编码,以遵守链接原则。 –

+0

我也使用POST来处理其他事情,所以我刚刚完成将此GET转换为POST。如果我使用'data:{..}',但是使用'params {..}',它会起作用'由于我使用了'JObject' - ex /'public HttpResponseMessage Post JObject dashboardObj)'。 JObject基本上显示一个空值。我会为此创建另一个帖子,因为这是一个非常重要的变化。 –