2017-01-20 1 views
1

저는 NodeJS를 처음 접했고 AWS Lambda에서 간단한 알렉사 서비스를 작성하여 집에서 온도를 알려주고 있습니다. 나는 내가 붙어있다 문제에 충돌 한 - 나는 홈 오토메이션 온도에 대한 몇 가지 데이터를 쿼리에 대한 HTTPS 엔드 포인트와 통신 할 때 - 내 노드 응용 프로그램이 오류와 함께 종료 :NodeJS, GET 요청시 TLSSocket.socketOnData에서 구문 분석 오류를 디버깅하는 방법?

Error: Parse Error 
    at TLSSocket.socketOnData (_http_client.js:362:20) 
    at emitOne (events.js:96:13) 
    at TLSSocket.emit (events.js:188:7) 
    at readableAddChunk (_stream_readable.js:176:18) 
    at TLSSocket.Readable.push (_stream_readable.js:134:10) 
    at TLSWrap.onread (net.js:551:20) 

이 상당히 간단하다 https를 통해 GET 요청을 보내면 엔드 포인트의 제공자는 Python을 사용하여 문제가 발생하지 않습니다. 내 노트북에서 로컬 노드 설정으로 코드 이동을 시도했지만 여전히 문제가 있습니다 (AWS가 아닙니다). 그것은 HTTPS 및 내 contral 밖에서 서비스로 응답을 일부 미묘한 방식으로 손상된 경우 사이트 wireshark 쉽게 wireshark 수 없습니다 - 그러나 나는 브라우저에서 실행할 수있는 코드를 변환 할 Browsify 사용하여 시도했다. wireshark) 그리고 물론 작동하고, 나는 json 응답에 대해 이상한 것을 볼 수 없다.

노드의 핵심 https 라이브러리 대신 응답 모듈을 사용해 보았지만 동일한 기본 오류가 발생합니다.

나는 내가 할 수있는 일에 열중하고있다. 그리고 이것을 디버깅하는 방법을 모른다. 그것은 포맷팅 문제 또는 타이밍 문제로 저를 강타합니다. 그러나 어떻게 접근해야할지 모르겠습니다. 누구 아이디어?

내 코드는 다음과 같습니다 : 노드에서 실행하면

var https = require('https'); 
var crypto = require('crypto'); 

function executeHttpRequest(path, data, method, username, password) { 

    var encodedLogin = getLoginString(username,password); 
    var stringData = JSON.stringify(data); 

    var requestOptions = { 
     host: 'hub-server.domain.co.uk', 
     port: 443, 
     path: path, 
     method: 'GET', 
     headers: { 
      'Cache-Control': 'no-cache', 
      'Accept': 'application/json, text/plain, */*', 
      'Authorization': 'Basic ' + encodedLogin 
     }}; 

    var request = https.request(requestOptions, function(response) { 

     var body=''; 
     response.setEncoding('utf8'); 

     response.on('error', function(err){ 
      console.log(method + " error: \n", err.stack); 
     }); 

     response.on('data', function (chunk) { 
      console.log("read data: " + chunk); 
      body += chunk 
     }); 

     response.on('end', function() { 
      console.log("end data"); 
     }); 

    }); 

    request.on('error', function(err) { 
     console.log('request error: \n' + err.stack); 
    }); 

    console.log("sending request:" + JSON.stringify(requestOptions)); 
    console.log("with data: " + stringData) 

    request.write(stringData); 
    request.end(); 
    console.log("closed request") 
} 

나는 비슷한 PUT 명령과 같은 오류가 다음과 같은 출력

sending request:{"host":"hub-server.domain.co.uk","port":443,"path":"/zone/1","method":"GET","headers":{"Cache-Control":"no-cache","Accept":"application/json, text/plain, */*","Authorization":"Basic bWFjdGEyOmY0OWZiODJlYTcyNWYzNDgwMTViODVjZTNlZmIyYmY1MWE4ZmI3YWUxMzJmZTRkNDk4OGEc"}} 
closed request 
request error: 
Error: Parse Error 
    at TLSSocket.socketOnData (_http_client.js:362:20) 
    at emitOne (events.js:96:13) 
    at TLSSocket.emit (events.js:188:7) 
    at readableAddChunk (_stream_readable.js:176:18) 
    at TLSSocket.Readable.push (_stream_readable.js:134:10) 
    at TLSWrap.onread (net.js:551:20) 

를 얻을. 흥미롭게도 PUT을 사용할 때 매개 변수를 놓친 경우 서버가 JSON 오류로 응답하면 위의 코드가 작동하여 오류를 설명하는 JSON이 표시됩니다. 마찬가지로 잘못된 URL이나 잘못된 AUTH를 사용하면 적절한 상태 코드를 올바르게 얻을 수 있습니다.

https://www.google.com을 타격하고 검색을하면 내 코드가 작동하는 것 같습니다.

분명히 뭔가가 있습니다.하지만 노드 코드를 수정하거나 엔드 포인트 작성자에게 어떻게 조언 할 수 있습니까?

답변

2

내 자신의 질문에 대한 답변 - 노드 플러그인 지원을 사용하여 IntelliJ에서이 코드를 실행하면 문제가 발생한 위치로 이동할 수있었습니다. 디버거를 사용하면 잘못 될 일을 쉽게 찾아 낼 수 있습니다.

http 파서가 실제로 오류 코드를 표시하고있는 것으로 나타났습니다. HPE_UNEXPECTED_CONTENT_LENGTH - Google에 대해 더 많이 검색하면 여러 다른 사람들이 홈 오토메이션과 관련하여이 모든 것을 경험했음을 알 수 있습니다.이 스레드의 결론 보안 문제로 인해 이후 버전의 Node 버전이 HTTP 사양에 대해 더욱 엄격 해졌습니다. 이 오류 코드를 사용하면 검색을 통해 비슷한 두 가지 사례 (예 : http.get Parse Error, code: 'HPE_UNEXPECTED_CONTENT_LENGTH')를 확인할 수 있습니다. 결론은 Content-Length와 Transfer-encoding이 모두 포함 된 청크 된 헤더 (오류)입니다. 내 응답에는이 오류가 없습니다. 그러나 선언 된 콘텐츠 길이가 잘못되었거나 어딘가에 가짜 cr/lf가 있는지 궁금합니다. 나는

IntelliJ debugging a node application

인 IntelliJ

에서이 가설을 디버깅 할 수있을 바라고 있어요
관련 문제