NodeJS http post请求读取超时

时间:2017-08-04 10:10:15

标签: node.js aws-lambda

我尝试在AWS Lambda中执行以下代码,该代码仅向ElasticSearch发出POST http请求。

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

正如您所看到的,我已尝试将超时设置为5秒,但我认为这是连接超时而非读取超时。

我做错了什么?

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();    
};

1 个答案:

答案 0 :(得分:1)

I think you should let the stream of incoming data finish before performing any data manipulation.

Example :

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