2017-08-04 99 views
2

我试图执行AWS Lambda内部的以下代码,该代码仅对ElasticSearch发出POST http请求。NodeJS http post请求读取超时

我面临的问题是,似乎nodejs请求有一个读取超时,并且响应几乎总是被切断并引发错误。我已检查该问题与设置为10秒的AWS Lambda超时无关,并且代码在不到一秒的时间内抛出错误。你可以看到,我试图把超时设置为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();  
}; 
+0

什么是错误消息或错误代码你得到? –

回答

1

我认为你应该在进行任何数据操作之前让输入数据流完成。

例子:

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