2016-03-29 4 views
-1

Ich schreibe einen Code, der die Anzahl der Anfragen innerhalb von 10 Sekunden zählt und er nur die ersten 4 Anfragen erlaubt. Dies wird alle 10 Sekunden wiederholt. Mein Beispielcode ist angehängt. Mein Problem ist, während mehrere Anfragen gleichzeitig von verschiedenen Maschinen kommen, verhält es sich anders. Wahrscheinlich ist der Grund, dass ich die Variable nicht synchronisiert habe. Bitte antworten Sie, wie das geht.Wie man eine Variable um jeweils eine Anfrage erhöht in nodejs

var http = require("http"); 
var Repeat = require("repeat"); 
var fs= require("fs"); 
var express=require('express'); 
var a=0;        /* This is the variable */ 
function send404PageNotFound(response){ 
    console.log("in 404"); 
    response.writeHead(404,{'content-type': 'text/plain'}); 
    response.write("$04 Page not Found"); 
    response.end(); 
} 

function onRequest(request, response) { 
    response.writeHead(200, {'Content-Type': 'text/plain'});  
    console.log('A request is coming from'); 
    console.log(request.connection.remoteAddress); 
    a=a+1; 
    console.log(a); 
    if(a<5) 
    { 
     if(request.method== 'GET' && request.url=='/'){ 
      response.writeHead(200,{'Content-Type': 'text/html'}); 
      fs.createReadStream("./index.html").pipe(response); 
     } 
     else{ 
      send404PageNotFound(response); 
     } 
    } 
    else 
    { 
     response.end('Server is busy\n'); 
    } 

} 
setInterval(function(){ a=0; },10000); 
http.createServer(onRequest).listen(8081); 
+0

"verhält es sich anders" ist diagnostisch nutzlos. Bitte beschreiben Sie genau, wie es sich verhält und wie es sich von dem unterscheidet, was Sie erwarten. "Ich habe die Variable nicht synchronisiert" - JS ist single-threaded, das Konzept der Synchronisation gilt nicht. – Amadan

Antwort

0

Dies ist ein Drossel Problem, so dass es ziemlich allgemein ist.

Sie fragen mit einem bestimmten Fall, aber eine gute Antwort kann auch anderen Menschen helfen.

Was Sie brauchen, ist die Zeit der letzten erfolgreichen Anfrage zu halten.

Wenn der Zähler über die Oberseite:

überprüfen, ob letzte akzeptierte Anfrage war mehr als 10 Sekunden vor. Wenn dies der Fall zurückgesetzt, um den Zähler (und akzeptieren Anfrage), ablehnen othwerwise die Anfrage

Sie benötigen document.addEventListener('click', function(ev){ mit function onRequest(request, response) {

zu ersetzen, um es für Sie arbeiten.

Hier gehen Sie auch auf codepen Throttle clicks demo

var count=0 
var lastReq 

document.addEventListener('click', function(ev){ 
    count++; 

    if(count>4){ 
    var now = new Date().getTime() 
    if(now-lastReq >=10000){ 
     console.log('reset: now accepting') 
     //reset 
     count=0; 
    }else{ 
     console.log('rejecting') 
    } 
    } 
    if(count<=4) 
    { 
    lastReq = new Date().getTime() 
    console.log('accepting') 
    //accept 
    } 
    console.log(count, lastReq); 
})