2014-08-30 2 views
6

HTTP 인터셉터에서 작동하지 location.path, 나는, 401S을 찾고는 HTTP 인터셉터가 문제는 $location.path('/login') 호출이 작동하지 않는 것처럼 보입니다. 경로가 완전히 무시되고 경로 상에 남아 있습니다 (빈 페이지 임에도 불구하고). 내 세션이 만료되었을 때 작동합니다. 한 가지 가능한 해결 방법은 전통적인 window.location = '/#!/login';을 사용하는 것입니다. 그러나이 방법은 이상적이지 않습니다. 또한 return $q.reject(response); 행을 제거하면 작동하지만, 여기에는 응답의 데이터 속성을 찾을 수없는 다른 오류가 있습니다 (해결책은 여기에서 설명합니다 : Angular.js $http.post TypeError: Cannot read property 'data' of undefined).

각도 1.2.21을 실행 중입니다.

여기에 무슨 일이 벌어지고 있는지에 대한 아이디어가 있으십니까? window.location으로 되 돌리는 것은 세상 끝이 아니지만 나는이 수수께끼에 대한 멋진 정리 솔루션을 원합니다. :)

미리 감사드립니다.

+0

관련 질문 : http://stackoverflow.com/questions/19499323/location-path-doesnt-change-in-a-factory-with-angularjs – Sirozha

답변

2

동일한 문제가 있습니다.

는 잘 모르겠어요하지만 모든 약속 할 때까지 응용 프로그램 대기가 해결되기 때문에 위치를 변경하지 않습니다 $location.path(...)처럼 보이는, 그리고 인터셉터 내부의 약속이하는 서비스 내 경우 (return $q.reject(response);)

을 거부 HTTP 요청은 UI 라우터 상태의 resolve 섹션에 배치되므로 $stateChangeError 이벤트를 사용하여 오류를 처리 할 수 ​​있습니다.

희망 (ngRoute 사용 $ routeChangeError 이벤트)이 당신을 도울 수 있습니다 :)

NB 401 응답 본문에 내 애플 리케이션 반환 사용자 지정 오류 메시지의 백엔드

PS 좀 더 나은 솔루션이 있어야합니다

UPDATE :

더 보편적 인 해결 방법 :

module.run 섹션에서 어딘가에 module.config

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

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

및 이벤트 핸들러 내부

인터셉터

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

(내가 $state.go('login')와 핸들러를 테스트했지만 $location.path('/login'); 정상적으로 너무 작동합니다 :))

+0

비슷한 주제 : http://blog.brunoscopelliti.com/xhr-interceptor -in-an-angularjs-web-app (차이점 ference는'.success()'콜백이 사용됨) – Sirozha

+0

내 코드는 $ state.go ('login')에서 작동하지만 $ location.path는 작동하지 않습니다 – windupurnomo

관련 문제