2017-08-04 12 views
2

私はElasticSearchへのPOST HTTPリクエストだけを行うAWS Lambda内で次のコードを実行しようとしています。NodeJS httpポストリクエストの読み取りタイムアウト

私が直面している問題は、nodejs要求に読み取りタイムアウトがあり、応答がほとんど常に切断され、エラーがスローされているようです。私は問題がAWS Lambdaタイムアウトに関連していないことを確認しました。これは10秒に設定されており、コードは1秒未満でエラーをスローします。

ご覧のとおり、タイムアウトを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);}); 
}); 
} 
関連する問題