2016-06-24 24 views
2

サーバーにデータをPOSTするnodejsの短いプログラムを作成しました。残念ながら、このプログラムは失敗します。しかし、興味深いのは、リクエストが何をしているのかを見るためにwiresharkを使用していて、私が作ったリクエストと同じくらいたくさんのTCP SYNパケットが見えないということです。Nodejsがサーバーにsynリクエストを送信していない、エラーEHOSTUNREACH

プログラムはここに含まれています。

//ServerTestv1.js 

var request = require('request'); 
var grouper = require('./grouper'); //Placeholder program. 

function sendSomething(obj){ 
    request.post(obj, function(error, response, body){ 
    if(response == undefined){ //This happens sometimes. I 'unno why. 
     reject(error); 
     console.log('Undefined POST Response, ' + error); 
    } else if(response.statusCode != 201 || error){ 
     reject(error); 
     console.log(error + response.statusCode + " " + response.body); 
    } else if(response.statusCode == 201){ 
     resolve(body); //Resolves the returned object, with unqiue ID. 
    } 
    }) 
} 

function inputParser(url, objArray){ 
    var pArray = []; 
    for(var i = 0; i < objArray.length; i++){ 
    pArray.push(sendSomething(objArray[i])); 
    } 
    Promise.all(promArray).then(function(returnedValues){ //Handles the unique ID the server assigned to the object. 
    var otherArray = []; 
    for(var u = 0; u < returnedValues.length; u++){ 
     var relatedObj = { 
     "value" : Math.random() * 10, 
     "relatedTo" : returnedValues[i].identifier 
     } 
     otherArray.push(sendSomething(relatedObj)); 
    } 
    Promise.all(otherArray).then(function(values){ 
     grouper.doSomething(values); //Placeholderfunction 
    }) 
    }) 
} 
+0

どのように正確に動作していませんか?あなたは構文エラーを認識していますか? – adeneo

+0

ああ、そうです。構文エラーは問題ではありませんが、実際のプログラム(これは問題のコードスニペットです)では、「エラー:ECONNHOSTUNREACH」と「未定義の応答」が表示されます。さらに、未定義の応答がある場合は、Wiresharkは「Syn」TCPパケットを送信していないことを示します。 –

+0

これはNodeとは関係がありません。ファイアウォールのような、ネットワークスタック内に存在する可能性が高いため、問題の原因になっています。 cURLのようなツールを使ってPOSTリクエストを作成できますか? – robertklep

答えて

-1

リクエストが氾濫している可能性があり、リクエストの一部がタイムアウトしている可能性があります。

です。

+0

パケットを実際に送信することなくタイムアウトしてはいけません。私のWiresharkのキャプチャでは、エラーで拒否されたリクエストに対して「SYN」パケットが表示されませんでした。 –

1

多くの同時要求がある場合にDNSが失敗することがあります。エラーは通常ECONNHOSTUNREACHエラーではありませんが、これは何か関連する可能性があるように感じます。

objの配列には、APIサービスのドメイン名が含まれていますか?存在する場合は、ドメイン名の代わりにIPを使用し、問題がまだ存在するかどうかを確認してください。

require('dns').resolve4('domain.name', (err, addresses) => { 
     ip = addresses[0]; 
    } 
); 

これは次のような方法で可能です。

+0

私はすぐにそれを試す時間がありませんが、賞金が期限切れになり、無駄になるので、あなたはそれを持つことができます。 :) –

関連する問題