NodeJS http post请求读取超时

我试图在AWS Lambda中执行下面的代码,它只对ElasticSearch发出一个POST HTTP请求。

我面临的问题是,似乎nodejs请求有一个读取超时,并且响应几乎总是被切断,并引发错误。 我已经检查过,问题与AWS Lambda超时设置为10秒无关,代码在不到一秒的时间内抛出错误。

正如你所看到的,我试图超时到5secs,但我认为这是一个连接超时,而不是读取超时。

我究竟做错了什么?

var http = require('http'); exports.handler = (event, context, callback) => { var options = { hostname: '172.31.40.10', port: 9200, path: '/articles/es/_search?_source=reference', method: 'POST', headers: { 'Content-Type': 'application/json', } }; var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (body) { var parsed = JSON.parse(body); var b = []; for (var i = 0; i < parsed.hits.hits.length; i++) { b.push(parsed.hits.hits[i]._source.reference); } var response = { statusCode: '200', body: JSON.stringify(b), headers: { 'Content-Type': 'application/json', } }; callback(null, response); }); }); req.on('error', function(e) { callback(new Error('fallo')); }); req.setTimeout(5000, function() {req.abort;}) req.on('socket', function (socket) { socket.setTimeout(5000); socket.on('timeout', function() { req.abort(); }); }); req.write(MY_QUERY_HERE); req.end(); }; 

我认为在执行任何数据操作之前,应该让传入的数据stream完成。

例如:

 var http = require('http'); //var _ = require('underscore'); function MyPostRequest(callback) { var options = { hostname:'172.31.40.10', port:9200, path:'/articles/es/_search?_source=reference', method:'POST', headers:{'Content-Type':'application/json'} }; http.request(options, function(res) { var tmpstore = ''; //temp. data storage //:Store the continuous incoming data stream res.on('data', function(d){tmpstore += d;}); //:Data reception is done, use it now... res.on('end', function() { var parsed = JSON.parse(tmpstore); var b = []; for (var i = 0; i < parsed.hits.hits.length; i++) { b.push(parsed.hits.hits[i]._source.reference); } /* //I suggest using underscore module : _.each(parsed.hits.hits,function(element, index, list){ b.push(element._source.reference); }); */ var response = { statusCode:'200', body:JSON.stringify(b), headers:{'Content-Type':'application/json'} }; callback(null, response); }); //:Response contained an error res.on('error', function(e){/*error handling*/callback(e,null);}); }); }