NodeJS,如何debuggingGET请求TLSSocket.socketOnData上的parsing错误?

我对NodeJS颇为陌生,并试图用AWS Lambda写一个简单的Alexa服务来告诉我房间的温度。 我遇到了一个困扰我的问题 – 当我尝试与https端点进行通信以查询家庭自动化恒温器的某些数据时 – 我的Node应用程序终止时出现错误:

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和我的控制之外的服务,我不能轻易wiresharkstream量发现,如果响应是以一些微妙的方式损坏 – 但我尝试使用Browsify转换代码运行在Web浏览器(我可以使用wireshark),当然,它的工作原理,我可以看到没有什么奇怪的JSON响应,然后我得到。

我已经尝试使用响应模块,而不是节点中的核心https库,但我仍然得到相同的基础错误。

我被困在我能做什么 – 而且不知道如何debugging。 它让我觉得格式问题或时间问题 – 但我不知道如何处理这个问题。 想法任何人?

我的代码如下所示:

 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") } 

在节点中运行时,我得到以下输出

 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命令相同的错误。 有趣的是,如果我在使用PUT的时候错过了一个参数,并且服务器回复了一个JSON错误,那么上面的代码就会工作,并向我显示logging错误的JSON。 同样,如果我使用无效的URL或错误的AUTH,我会正确地获得适当的状态码。

我的代码也似乎工作,如果我试图打https://www.google.com并进行search。

很明显,有些东西是可以的,但是我怎样才能纠正我的节点代码,或者告诉terminal的作者?

在回答我自己的问题 – 使用Node插件支持在IntelliJ中运行此代码,我能够进入问题发生的地方。 有一个debugging器,这使得更容易发现哪里出了问题。

我发现HTTPparsing器实际上显示了一个错误代码:HPE_UNEXPECTED_CONTENT_LENGTH – 在谷歌上search更多关于这个,我看到其他几个人已经经历了这一点(有趣的是,所有与家庭自动化有关) – 这些线程的结论是,由于安全问题,节点对HTTP规范的要求越来越严格。 有了这个错误代码,search揭示了两个类似的情况下我的(例如http.getparsing错误,代码:'HPE_UNEXPECTED_CONTENT_LENGTH' )的结论是有一个响应与内容长度和传输编码:chunked头一起存在(这是一个错误)。 我的回应没有这个错误,但是我不知道是否声明的内容长度是错误的,或者在响应中是否存在假的cr / lf。 我希望我可以在IntelliJ中debugging这个假设

IntelliJ调试节点应用程序