2014-09-04 2 views
2

미래를 사용하여 URL 세트에서 비동기 적으로 HTTP.get을 수행하려고합니다.Meteor HTTP.get 오류 처리

유성 버전 : 0.8.3 플랫폼 : Windows 서버 2012

이 코드는 다음과 같이 다소이다

var futures = _.map(test, function(url) { 

var future = new Future(); 
var onComplete = future.resolver(); 

try{ 
    // Make async http call 
    var httpGet = HTTP.get(url,{followRedirects: true},function(error, result) { 
     if(error) 
     { 
      apiLogger.error("%s is error",error); 
      onComplete(error, null); 
     } 
     else 
     { 
      if(result!=null){ 
       //operations done here 
       onComplete(error, JSON.stringify(object1));     
      } 
      else { 
       apiLogger.error('%s - User encountered an error. URL not parsed: %s',user,url); 
       onComplete(error, null); 
      } 
     } 
    }); 
} 
catch(e) 
{ 
    apiLogger.error('%s - URsarsed: %s - %s',user,url,result.statusCode); 
    onComplete(error, null); 
} 
return future; 
}); 

내가 직면하고 문제는 부적절한 에러 처리이다.

나는 일부 URL에 다음과 같은 오류가 점점 오전 :

I20140904-17:57:38.609(-4)? Exception while invoking method 'parallelAsyncJob' E 
rror: failed [404] <html><head><title>Apache Tomcat/7.0.12 - Error report</title 
><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color 
:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;ba 
ckground-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif; 
color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,A 
rial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial 
,sans-serif;color:white;background-colo... 
I20140904-17:57:38.617(-4)?  at packages/underscore/underscore.js:255 
I20140904-17:57:38.619(-4)?  at Array.map (native) 
I20140904-17:57:38.621(-4)?  at Function._.map._.collect (packages/underscore 
/underscore.js:123) 
I20140904-17:57:38.623(-4)?  at Function._.invoke (packages/underscore/unders 
core.js:254) 
I20140904-17:57:38.626(-4)?  at Meteor.methods.parallelAsyncJob (app/server/m 
ethods.js:1:9355) 
I20140904-17:57:38.628(-4)?  at maybeAuditArgumentChecks (packages/livedata/l 
ivedata_server.js:1488) 
I20140904-17:57:38.631(-4)?  at packages/livedata/livedata_server.js:650 
I20140904-17:57:38.632(-4)?  at _.extend.withValue (packages/meteor/dynamics_ 
nodejs.js:37) 
I20140904-17:57:38.635(-4)?  at packages/livedata/livedata_server.js:649 
I20140904-17:57:38.644(-4)?  at _.extend.withValue (packages/meteor/dynamics_ 
nodejs.js:37) 
I20140904-17:57:38.646(-4)?  - - - - - 
I20140904-17:57:38.648(-4)?  at makeErrorByStatus (packages/http/httpcall_com 
mon.js:12) 
I20140904-17:57:38.650(-4)?  at Request._callback (packages/http/httpcall_ser 
ver.js:99) 
I20140904-17:57:38.652(-4)?  at Request.self.callback (C:\Users\Administrator 
\AppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.js:122: 
22) 
I20140904-17:57:38.655(-4)?  at Request.EventEmitter.emit (events.js:98:17) 
I20140904-17:57:38.657(-4)?  at Request.<anonymous> (C:\Users\Administrator\A 
ppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.js:888:14 
) 
I20140904-17:57:38.660(-4)?  at Request.EventEmitter.emit (events.js:117:20) 
I20140904-17:57:38.662(-4)?  at IncomingMessage.<anonymous> (C:\Users\Adminis 
trator\AppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.j 
s:839:12) 
I20140904-17:57:38.665(-4)?  at IncomingMessage.EventEmitter.emit (events.js: 
117:20) 
I20140904-17:57:38.668(-4)?  at _stream_readable.js:920:16 
I20140904-17:57:38.669(-4)?  at process._tickCallback (node.js:415:13) 

내가 뭔가 잘못하고 있습니까? 아니면 문제가 있습니까?

업데이트 :

  1. 내가 사용하고 선물은 최종 작업은 모든 URL을 받고 이후에 수행 될 수 있기 때문이다.

  2. 흥미로운 점은 브라우저를 통해 URL을 열 수 있으며 POSTMAN과 200 개의 상태도 얻을 수 있습니다. 하지만 유성이 수신 중입니다.

답변

-1

오류 메시지에 따라 404 오류 코드가 표시됩니다. 일부 URL이 유효하지 않습니다. 그리고 특정 URL에서만 발생한다고 스스로 말합니다.

이러한 모든 미래와 함께 코드가 왜 복잡합니까? HTTP.get() itself offers an asyncCallback이고 코드에서 인라인 콜백을 이미 사용하고 있으므로 모든 미래 물건을 제거하지 않는 이유는 무엇입니까?

_.map(test, function(url) { 
    try { 
    // Make async http call 
    HTTP.get(url, {followRedirects: true}, function(error, result) { 
     if (error) { 
     if (result.statusCode == 404) 
      apiLogger.error('Error 404, URL not found: %s', url); 
     else 
      apiLogger.error('Error %s from %s for user %s', 
      result.statusCode, url, user); 
     return false; 
     } else { 
     if (result != null) { 
      // operations done here 
     } else { 
      apiLogger.error('Empty or invalid result returned from %s for user %s', 
      url, user); 
     } 
     return false; 
     } 
    }); 
    } catch (error) { 
    return false; 
    } 
}); 
+0

최종 작업은 모든 URL을 가져온 후에 수행 할 수 있기 때문에 선물을 사용하고 있습니다. 위의 콘솔 오류는 statusCode 요청이 200이 아닌 경우에만 발생합니다. 선물을 사용하는 동안 내가 알아야 할 것은 (문제가 관련되어 있다고 생각하기 때문에) – tgarg