2016-08-17 7 views
0

Node.jsを初めて使用しています。Nodeサーバーのスロットル(Express/jQuery)へのAJAXリクエストの繰り返し

jQueryを使用してローカルノードサーバー(データは関係ありません)に簡単なAJAX GETリクエストを実行するボタンを持つクライアントWebページがあります。これは、すべてのリクエストのカウンタの値がapp.get()です。コンソールに記録されているので、どれくらいのリクエストが成功したかを知ることができます。

たとえば、ボタンをクリックすると、1秒に1回、コンソールにカウンタが表示されます。しかし、私がを繰り返してをクリックすると(1秒間に4〜5回)、サーバーはログを記録し、コンソールのカウンタを後で、通常はクリック数に応じて数分間表示します。それは要求を絞っている。

実際の制作の面では、私が意図している実際のアプリはそういうAJAXリクエストを「乱用する」とは考えられませんが、これは問題ではないと私は期待していましたが、ユーザはボタンを乱用しない。

問題を再現するMWEがあります。

server.js

const express = require('express'); 
const MongoClient = require('mongodb').MongoClient 
//const bodyParser= require('body-parser'); 
const app = express(); 
//app.use(bodyParser.urlencoded({extended: true})); 
//app.use(express.static(__dirname + '/public')); 

app.set('view engine', 'ejs'); 

var db; 
var clientURL = 'mongodb://127.0.0.1:27017/mydatabase' 
var clientPort = 3000 

MongoClient.connect(clientURL, (err, database) => { 
    if (err) return console.log(err) 
    db = database 
    app.listen(clientPort,() => { 
    console.log('Listening on '+clientPort) 
    }) 
}) 

app.get('/', (req, res) => { 
    res.render('client.ejs') 
    }) 
}) 

var c = 0; // counter 
app.get('/mydatabase/endpoint', (req, res) => { 
    c = c + 1 
    console.log(c) 
}) 

scripts.js

$(document).ready(function(){ 
    $(".button").on("click", function(){ 
     // AJAX GET 
     $.ajax({ 
      url: "mydatabase/endpoint", 
      type: "get", 
      data: "..." // not imporant 
     }) 
    }); 
}) 

クライアント.buttonクラスを持っているbutton要素を持つ単純なHTMLページです。

PCスペック:Windows 7 Professional 32ビット、Intel Core 2 Quad CPU Q6600 2.40GHz、4GB RAM(これは本当に古いシステムです。)

質問はなぜそのようなスロットルのようなものですか?それは:a)私のマシン、b)貧弱なロジックのアプローチ、またはc)ExpressまたはNode.jsと関係があるでしょうか?私は、Apache/PHPでこれが起こっていることを覚えていません。

答えて

0

私はここで何が起こっているかは、特定の数を超えるとブラウザが要求をキューに入れていると思います。ブラウザーは、特定のドメインに対して同時に実行される要求の数を制限し、それを超えると、前の要求が戻るまで要求をキューに入れます。

また、カウンタ付きのapp.get()は応答を返さないため、ブラウザが最初にN要求を待つのを待って終了します。最終的に(数分後)、タイムアウトしてからさらにリクエストを送信できます。

これはすべて、サーバーで行われていることが値を記録している場合は、サーバーの問題ではないかと疑いがあります。

あなたは、おそらくこの問題は、単に応答を送信することで消すことができます。

var c = 0; // counter 
app.get('/mydatabase/endpoint', (req, res) => { 
    ++c; 
    console.log(c); 
    res.send("" + c); 
}); 

は、あなたが実際に返すことは何もない場合でも、あなたはExpressでのハンドラを定義する任意の経路は、応答のいくつかの並べ替えを送るべきであることを覚えておいてください。さもなければ、発信者はただ応答が起こるのを待ってそこに座り、物事を詰まらせる可能性があります。

+0

申し訳ありませんが、あなたの説明は絶対的な意味を持ちます。単純な文字列をクライアント/ブラウザに返信することで問題は解決しました。しかし、私は 'c'を送ることができませんでした。アプリケーションがクラッシュしたため、私は500のステータスを取得しました。 – absay

+0

@absay - OK、文字列を送信するように私の答えを変更しました。これがあなたの質問に答える(それはそうであると思われる)場合は、答えの左側にある緑色のチェックマークをクリックしたことを示すことができます。 – jfriend00

関連する問題