2014-12-13 2 views
0

웹 소켓을 통해 $ http.get을 실행 중이고 .error가 매개 변수를 채우지 않습니다. 저는 각도 1.3.5를 사용 중이며 OSX에서 최신 Chrome을 사용하고 로컬 호스트는 mywebsite.com에 별명을 지정합니다.

$http({method: 'GET', 'ws://mywebsite.com/resource'}) 
.success(function(response){ ... }) 
.error(function(err, status){ 
    console.log(err); <<< here err and status are null respectively 0 even the XHR Response logs 401 in console. 
}); 

이렇게하는 이유는 무엇입니까? 어떤 오류 코드가 아니라면 오류 콜백으로 전달되지 않습니다. 2xx 응답 들어, 나는 데이터를 얻을 모두 괜찮아요.

명확히하기 위해 .error 콜백은 정상적으로 호출되지만 오류 및 상태는 채워지지 않습니다.

+0

은 오타입니다. 당신은 두 개의 점'headers}를 넣는다). .success' – Abdelouahab

+1

'ws' 대신'http' 요청으로 시도하면 미안 해요 내 머리글 변수가 실제 코드 – Biba

+0

에서 붙여 넣어집니다. 콜백이 채워지나요? – Abdelouahab

답변

1

글쎄요, 무슨 일이 일어나고 있는지 발견했습니다. 사물의 콤보.

먼저 KOA를 사용하고 위의 각진 치는 KOA를 REST API로 사용합니다. 또한 koa-jwt를 사용하여 사용자를 인증하고 토큰을 생성합니다.

이제 api는 하위 도메인에서 실행되며 심지어 액세스를 허용하기 위해 코아를 통해 CORS를 설정합니다.

문제는 토큰이 만료되면 koa-jwt가 this.throw (401)를 수행한다는 것입니다. KOA가 처리하는 방식으로 후속 미들웨어를 즉시 종료하고 그 오류로 종료합니다. 그건, 내가 미들웨어를 어디에 두든간에 (koa-jwt 이전 또는 이후), koa-cors 헤더를 설정할 수 없었습니다.

따라서 우아한 시도는 try catch에서 내 최상위 수율을 감싸고 koa-jwt ctx.throw가 전파되지 않도록하는 것이 었습니다.

각도 측면에서 브라우저는 적절한 CORS를 찾지 못해서 응답을 처리하고 전달할 수 없다는 불만을 표시하여 거부했습니다.

app.use(cors({origin:"*", methods:'GET,HEAD,PUT,POST,DELETE,PATCH'})); //allow all origins to the API. 
app.use (function *(next){ 
    try { 
     yield next; 
    } catch (err) { 
     this.status = err.status || 500; 
     this.body = err.message; 
     this.app.emit('error', err, this); 
    } 
}); 

... more middleware 
// middleware below this line is only reached if jwt token is valid 
app.use(jwt({secret: config.app.secret})); 

koa-jwt에서 this.trow (401)를 허용하면 하루를 망칠 수 있습니다.

+0

감사합니다. 매우 효과적 –

0

난 그냥 같이 쓰기, 그냥 오타를 만들 생각 : 오타 오류가 아닌 경우

$http({method: 'GET', 'ws://mywebsite.com/resource', headers: headers}) 
.success(function(response){ ... }) 
.error(function(err, status){ 
    console.log(err); 
}); 

그러나 가장 좋은 방법은 나뿐만

var request = { 
    method: 'GET', 
    url: 'ws://mywebsite.com/resource', 
    headers: {//insert here header you want, put Origin header only for example purposes 
     Origin: 'ws://mywebsite.com/resource' 
    } 
} 

$http(request) 
.success(function(response){ ... }) 
.error(function(err, status){ 
    console.log(err); 
}); 

할 것 (당신은 할 수있다 코드 복사) AngularJS $http error function never called

+0

오타의 문제는 아니며 코드에서 상태 코드가 2xx가 아닌 경우 .error 콜백이 실제로 발생하면 오류가 null입니다. 내 코드에서 헤더를 생략 할 수 있습니다. 문제는 여전히 남아 있습니다. – Biba

+0

컨트롤러를 어떻게 정의합니까? 어쩌면 폐쇄가 필요합니다. – greenfox

+0

@Biba "then"을 사용하여 코드를 처리하려고 했습니까? – greenfox

관련 문제