2017-03-12 10 views
1

nodejsサーバにJSONリクエストを1つずつ送信します。 6回目のリクエスト後、サーバはすぐにクライアントに返信することができず、少し時間がかかります(15秒以上、もう一度私に返信してください)。MongoDBへの書き込みJson値が発生し、時刻は重要です。私はREST呼び出しに関して言います。この場合、どのようにエラーを見つけることができますか? (ツールやスクリプトコードは私を助けることができますか?)私のサーバー側のコードはそうですHTTPリクエストがNodejsサーバですぐに応答を送信できない

var controlPathDatabaseSave = "/save"; 
app.use('/', function(req, res) { 
console.log("req body app use", req.body); 
var str= req.path; 

if(str.localeCompare(controlPathDatabaseSave) == 0) 
{ 
    console.log("controlPathDatabaseSave"); 
    mongoDbHandleSave(req.body); 
    res.setHeader('Content-Type', 'application/json'); 
    res.write('Message taken: \n'); 
    res.write('Everything all right with database saving'); 
    res.send("OK"); 
    console.log("response body", res.body); 
} 

});以下のように

私のクライアント側のコード:

function saveDatabaseData() 
{ 
    console.log("saveDatabaseData"); 
     var oReq = new XMLHttpRequest(); 
     oReq.open("POST", "http://192.168.80.143:2800/save", true); 
     oReq.setRequestHeader("Content-type", "application/json;charset=UTF-8"); 
     oReq.onreadystatechange = function() {//Call a function when the state changes. 
      if(oReq.readyState == 4 && oReq.status == 200) { 
       console.log("http responseText", oReq.responseText); 
      } 
     } 
     oReq.send(JSON.stringify({links: links, nodes: nodes})); 
} 

保存--Mongodbコード

function mongoDbHandleSave(reqParam){ 
//Connect to the db 
    MongoClient.connect(MongoDBURL, function(err, db) 
    { 
     if(!err) 
     { 
      console.log("We are connected in accordance with saving"); 
     } else 
     { 
      return console.dir(err); 
     } 

    /* 
     db.createCollection('user', {strict:true}, function(err, collection) { 
      if(err) 
       return console.dir(err); 
     }); 
    */ 
     var collection = db.collection('user'); 
     //when saving into database only use req.body. Skip JSON.stringify() function 
     var doc = reqParam; 
     collection.update(doc, doc, {upsert:true}); 
    }); 

}

あなたはGoogle Chromeの開発者エディタで私のREST呼び出しを見ることができます。

enter image description here

--Client出力(第6のコールは200 OK。最後の1が保留状態になっている)

enter image description here

--server出力

enter image description here

事前に感謝、

+0

サーバーの出力とクライアントのjavascriptコンソールの出力を貼り付けることはできますか?尊重して、あなたのコードをきれいにすることができますが、バグがどこから来ているのかを見つけるのを助けるかもしれません... **編集:**また 'mongoDbHandleSave'関数を含めてください。データベース資格情報が含まれている場合は、資格情報を変数に置き換えます。 –

+0

@FissureKingあなたの希望に応じて質問を更新しました。 – zoint

+0

私の推測では、あなたの 'ServerResponse'は終了していないということです。 'application/json'の値を持つ' Content-Type'ヘッダーを設定してプレーンテキストを送信することを除いては、あなたのルートにある 'mongoDbHandleSave'の後ろにすべてコメントしてみて、 : 'res.status(200).end()'。 –

答えて

2

これはブラウザからのAjaxリクエストであるように見えるので、各ブラウザは同じホストに同時に接続できる数に制限があります。ブラウザーは時間の経過とともにその設定を変えましたが、おそらく4-6の範囲です。したがって、同じホストに同時に6つのAjax呼び出しを実行しようとすると、その制限に達している可能性があります。ブラウザが行うことは、最初のものが終了するまで(最新のものを一度に送信することを避けるため)、最新のものを送信することを止めさせることです。

ここでの一般的な考え方は、単一のクライアントがサーバーを過度に叩くのを防ぐことで、負荷を多くのクライアント間でより公平に共有できるようにすることです。もちろん、サーバーに何もする必要がなければ、実際には接続をいくつか保護する必要はありませんが、これは対話型システムではなく、限界までハード配線されています。

処理中の他のリクエスト(画像やスクリプトやCSSスタイルシートの読み込み)が同じ原点にある場合、それらも上限にカウントされます。

これをChromeで実行し、デバッガの[ネットワーク]タブを開くと、実際にタイムライン上で特定のリクエストが送信された時刻と応答が受信された時刻を正確に確認できます。これにより、後の要求がブラウザまたはサーバーで保持されているかどうかがすぐに表示されます。

トピックに関する記事は、Maximum concurrent connections to the same domain for browsersです。

また、サーバー上の要求とサーバーの構造によっては、一度に効率的に処理できるサーバー要求が最大数になることがあります。たとえば、4つのCPUごとに1つのスレッドで構成されたブロッキング・スレッド・サーバーを使用していた場合、サーバーは4つの要求を同時に処理すると、最初の要求が完了するまで5番目の要求をキューに入れなければならないことがあります他のものよりも遅れている。

+0

@zoint - これはあなたの質問に答えましたか? – jfriend00

関連する問題