2017-09-04 150 views
4

我使用的是非常基本的angularJS代碼一個用戶登錄這樣的:AngularJS承諾抓401

[...] 
this.login = function(email, password) { 
    promise = $http.post('/login', 
      { 
       'email': email, 
       'password': password 
      }); 
    promise.then(function(response){ 
      console.log("success"); 
     }).catch(function(response){ 
      console.log("catch"); 
     }).finally(function(response){ 
      console.log("finally"); 
     }); 
    return promise; 
}; 
[...] 

當REST API生成代碼爲200的響應,則客戶端控制檯將記錄success finally和用戶已登錄。
當服務器使用403或500代碼生成響應時,控制檯將打印出catch finally

但是,當響應將與401,角沒有打印出任何東西。控制檯將保持爲空,只有POST http://127.0.0.1/login 401 (Unauthorized)提示。但沒有successcatch作爲輸出。也沒有finally

在我的項目中,403將在全球範圍內以$rootScope.$on('event:auth-forbidden', function(r) {...});捕獲。這就是爲什麼REST服務器只會在找不到東西時才拋出404,當用戶沒有權限和/或未登錄時403,以及僅當登錄失敗時纔會拋出401。

那麼我怎樣才能在$http上找到401?
是不是.then承諾只爲返回200和.catch爲每隔一個返回!= 200?

我使用angularJS v1.6.4和angular-http-auth v1.5.0。

+0

我認爲這篇老文章是一個很好的參考。您可以鏈接.success .error instad然後。要不然。你可以使用。然後檢查響應對象,它應該有一個狀態代碼屬性,指示你是否應該拒絕或解決承諾https://weblog.west-wind.com/posts/2014/Oct/24/AngularJs-and- Promises-with-the-http-Service – Tim

+1

你使用'angular-http-auth'模塊嗎? – alexmac

+0

...或者有任何全球'$ http'攔截器註冊? – Phil

回答

2

的問題是,angular-http-auth模塊截獲與狀態401或403中的對策:

$http攔截器執行以下操作:配置對象(這是所請求的URL,有效載荷和參數)每隔HTTP 401的響應被緩衝並且每次發生時,事件:auth-loginRequired消息從$rootScope廣播。

要禁用401攔截設置ignoreAuthModule: true

有時候,你可能不想攔截,即使一個返回401或403。在這樣的情況下攔截的請求,您可以添加ignoreAuthModule: true到請求配置。

該模塊在401狀態下爲暫掛狀態創建新的承諾。響應緩衝,您有機會致電authService.loginConfirmed()authService.loginCancelled()函數。第一個重試由於HTTP 401響應而導致的以前失敗的所有請求。當第二個取消之前由於HTTP 401響應而失敗並緩衝的所有未決請求時。

Docs

+0

好的,這很有趣。如果REST拋出403,'event:auth-forbidden'和'$ http.catch'是triggert。但是如果RESt引發401,只有'vent:auth-loginRequired'是triggert,但是'$ http.catch'不是。爲什麼漁獲不工作?它只會觸發403或500 ... – christopher2007

+1

好問題,根據[this code](https://github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js #L59)在狀態爲401的情況下,創建新的承諾並返回。不會調用catch函數,因爲這個新的promise處於掛起狀態。 – alexmac

+0

有趣...但只有403正在創造一個新的承諾,可以抓住。 401只是中斷。只有使用'ignoreAuthModule',它纔會進入'catch'和'finally'。這是非常令人困惑的......當REST拋出401時,沒有最後的承諾。 – christopher2007