2017-10-04 1 views
0

현재 AWS API 게이트웨이로 전환중인 회사 API가 있습니다. API 게이트웨이의 엔드 포인트는 Node.js 람다 함수를 사용하여 속도 제한 및 인증을 위해 AWS를 사용하여 기존 내부 엔드 포인트를 공격합니다. 나의 첫번째 엔드 포인트는 완벽하게 작동,하지만 내 두 번째 엔드 포인트는 나에게 빈 응답을 제공하고 CloudWatch에서 나는 다음과 같은 오류 참조 : 나는 우리의 API를 칠 경우AWS API 게이트웨이 예상치 못한 JSON 입력 끝

2017-10-04T03:24:46.957Z 925a40ba-a8b3-11e7-be24-8d954fcaf057 
SyntaxError: Unexpected end of JSON input 
at Object.parse (native) 
at IncomingMessage.<anonymous> (/var/task/index.js:67:37) 
at emitNone (events.js:91:20) 
at IncomingMessage.emit (events.js:185:7) 
at endReadableNT (_stream_readable.js:974:12) 
at _combinedTickCallback (internal/process/next_tick.js:80:11) 
at process._tickDomainCallback (internal/process/next_tick.js:128:9) 

직접 제대로 반환 유효한 JSON

[{"name":"Distinct Zips","offers":8,"affiliates":1,"margin":0,"profit":0,"paid":0,"received":0,"conversion_rate":100,"average_profit":0,"total_calls":1,"qualified_calls":1,"duplicate_calls":0,"returned_calls":0},{"name":"","offers":0,"affiliates":0,"margin":0,"profit":0,"paid":0,"received":0,"conversion_rate":0,"average_profit":0,"total_calls":0,"qualified_calls":0,"duplicate_calls":0,"returned_calls":0},{"name":"Total","offers":8,"affiliates":1,"margin":0,"profit":0,"paid":0,"received":0,"conversion_rate":100,"average_profit":0,"total_calls":1,"qualified_calls":1,"duplicate_calls":0,"returned_calls":0}] 

을 JSON이 유효하므로 AWS가 예상치 못한 오류로 인해 오류를 반환하는 이유가 확실하지 않습니다. 결과를 배열이 아닌 단일 JSON 항목으로 변경하려고 시도했지만 CloudWatch에서 여전히 동일한 오류가 발생했습니다. 나는 우리의 람다 함수에 문제가 있을지, 아니면 코드베이스가 실제로 리턴하는 것과 관련이 있는지를 알기조차하지 않습니다. 요청이 람다 함수의 적분을 사용하지만, 람다 통합 프록시를 사용하지 않는 투명감

위한

편집. 전체 람다 우리는 콜백을 사용하여 람다에서 청크 분할 데이터를 처리 https://gist.github.com/awestover89/a53c0f2811c566c902a473ea22e825a5

에서 볼 수있다 :

callback = function(response) { 
    var responseString = ''; 

    // Another chunk of data has been recieved, so append it to `str` 
    response.on('data', function (chunk) { 
     responseString += chunk; 
    }); 

    // The whole response has been received 
    response.on('end', function() { 
     console.log(responseString); 
     // Parse response to json 
     var jsonResponse = JSON.parse(responseString); 

     var output = { 
      status: response.statusCode, 
      bodyJson: jsonResponse, 
      headers: response.headers 
}; 
+0

APIGateway 구성 방법은 무엇입니까? "통합 요청"섹션에서 "람다 함수"와 "람다 프록시 통합 사용"을 선택 했으므로 모든 것을 똑바로 통과하게됩니까? –

+0

처리기에서'console.log'에'event'를 입력하고 CloudWatch 로그를 확인하십시오. 당신이 보는 것과 당신의 질문을 업데이트하십시오. – dashmug

+0

http/https를 사용하여 백엔드에서 응답을 가져 오는 것처럼 들리는데 전체 응답을 기다리는 대신 데이터의 첫 번째 청크를 구문 분석하도록하는 응답을 캡처하는 방식에 문제가있을 수 있습니다. 코드는 응답의 청크 도착 크기 나 타이밍과 관련하여 실패합니다. JSON.parse (foo)'직전에'console.log (foo)'? 즉, 실제 API 게이트웨이 문제가 아니라 람다 문제입니다. –

답변

0

문제는 우리의 응용 프로그램의 끝이었다. API 게이트웨이는 application/json으로 모든 요청에 ​​대한 Content-Type 헤더를 application/json으로 설정하고 content-type이 JSON으로 설정되면 본문을 가져 오기 위해 모든 쿼리 문자열 매개 변수를 스크럽합니다.

이 끝점에는 제거되는 필수 쿼리 문자열 매개 변수가 있으므로 실패했으며 다시 보내온 오류 메시지의 형식이 JSON이 아니므로 노드에서 구문 분석 할 수 없습니다.

관련 문제