2014-08-30 15 views
6

này được thiết lập khá thẳng về phía trước của bạn, tôi có một đánh chặn http rằng đang tìm kiếm 401s, nếu tìm thấy người dùng sẽ được chuyển hướng đến trang đăng nhập:

function($location, $q) 
{ 
    return { 
     request: function (config) { 
      return config || $q.when(config); 
     }, 
     requestError: function(request){ 
      return $q.reject(request); 
     }, 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     responseError: function (response) 
     { 
      if (response && response.status === 401) 
      { 
       $location.path('/login');      
      } 

      return $q.reject(response); 
     } 
    }; 

} 

Các vấn đề là cuộc gọi $location.path('/login') dường như không hoạt động, đường dẫn hoàn toàn bị bỏ qua và tôi vẫn ở trên tuyến đường (mặc dù trang trống) tôi đã bật khi phiên của tôi hết hạn. Một cách giải quyết khác là sử dụng số window.location = '/#!/login'; truyền thống nhưng tôi thấy điều này ít hơn lý tưởng. Tôi cũng thấy rằng nếu tôi loại bỏ các dòng return $q.reject(response); tôi nhận được nó làm việc, NHƯNG này giới thiệu một lỗi mà không tìm thấy thuộc tính dữ liệu của phản ứng (giải pháp được thảo luận ở đây: Angular.js $http.post TypeError: Cannot read property 'data' of undefined).

Tôi đang chạy góc 1.2.21.

Mọi ý tưởng về những gì có thể xảy ra ở đây? Hoàn nguyên để window.location không phải là kết thúc của thế giới nhưng tôi rất thích một giải pháp gọn gàng tốt đẹp cho bí ẩn này :).

Xin cảm ơn trước.

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/19499323/location-path-doesnt-change-in-a-factory-with-angularjs – Sirozha

Trả lời

2

Tôi có cùng một vấn đề.

Tôi không chắc chắn, nhưng hình như $location.path(...) không thay đổi vị trí vì ứng dụng đợi cho đến khi tất cả những lời hứa sẽ được giải quyết, và lời hứa bên trong đánh chặn bị từ chối (return $q.reject(response);)

Trong trường hợp của tôi các dịch vụ mà không http yêu cầu được đặt bên trong phần resolve trạng thái giao diện người dùng-bộ định tuyến, vì vậy tôi có thể sử dụng sự kiện $stateChangeError để xử lý lỗi. (ví ngRoute sử dụng $ kiện routeChangeError)

Hy vọng điều này có thể giúp bạn :)

NB Các backend của ứng dụng thông báo lỗi trở lại tùy chỉnh của tôi trong cơ thể 401 phản ứng

PS Phải có một số giải pháp tốt hơn

UPDATE:

More phổ workaround:

đánh chặn bên trong module.config

... 
responseError: function (response) { 
    if (response && response.status === 401) { 
     $rootScope.$emit('loginRequired'); 
    } 

    return $q.reject(response); 
} 
... 

và xử lý sự kiện ở đâu đó trong phần module.run

$rootScope.$on('loginRequired', function() { 
    $location.path('/login'); 
}); 

(tôi đã thử nghiệm xử lý với $state.go('login') nhưng $location.path('/login'); nên làm việc quá :))

+0

Tâm hồn tương tự: http://blog.brunoscopelliti.com/xhr-interceptor -in-an-angularjs-web-app (sự khác biệt ference là gọi lại '.success()' được sử dụng) – Sirozha

+0

Mã của tôi hoạt động với $ state.go ('login') nhưng $ location.path không hoạt động – windupurnomo

Các vấn đề liên quan