2017-06-01 1 views
1

mit Nodejs und Express Ich versuche, eine js Funktion auszulösen, die ein einfaches Konsolenprotokoll enthält. Leider löst die Funktion nur 6 mal aus und friert für eine Weile. Nach ein oder zwei Minuten klickt der Knopf, der während der "eingefrorenen Zeit" geklickt wurde, auf einmal. Es passiert immer nach 6-maligem Drücken eines Knopfes.Nodejs, Express, Ajax: Funktion triggert nur Six Times

index.html -> Taste
Client-Seite -> jQuery-Funktion, die eine Ajax-Post-Funktion
server.js löst -> enthält die Express-Funktion, die löst das Konsolenprotokoll

index.html

<input type="button" id="car" value="drive"/> 

clientside.js

$('#car').click(function(){ 

    $.ajax({ 
     type:'POST', 
     url: url + '/drive' 
    }); 

}); 

server.js

var app = express(); 

app.post('/drive', function(req, res){ 

    console.log('Car starts driving'); 

}); 

Was mache ich falsch? Irgendwelche Tipps, wie ich meinen Code verbessern kann?

Danke

+2

Es könnte sein, weil Ihr Server nicht reagiert. Testen Sie das zufällig in Chrome? Chrome erlaubt 6 gleichzeitige Anfragen an einen Hostnamen. Nach 6 blockiert der Browser Sie mehr Anfrage. Versuchen Sie in Ihrer Datei server.js 'res.send (200)' nach der Zeile 'console.log (...) 'aufzurufen. – dan

+0

Stellen Sie in Ihrem server.js-Modul sicher, dass Sie zurückkehren. Wie res.send ('Auto startet fahren') –

+0

In Ihrer clientside.js, empfiehlt es sich, die Schaltfläche zu deaktivieren, nachdem geklickt wurde, und dann im Ajax-Aufruf entweder erfolgreich oder fehlgeschlagen zu aktivieren –

Antwort

3

Ihr Server muss auf die Anforderung antworten. Versuchen Sie, Ihren Server zu aktualisieren:

var app = express(); 

app.post('/drive', function(req, res){ 

    console.log('Car starts driving'); 
    res.sendStatus(200) 

}); 

Dies wird 200 OK für alle Anfragen zurückgeben.

Warum passiert das nach 6 Anfragen? Ich schätze, Sie verwenden Chrome oder Firefox. Chrome und Firefox erlauben nur maximal 6 gleichzeitige Anfragen an einen einzelnen Server. Sobald Sie 6 erreichen, wird der Browser die verbleibenden Anfragen in die Warteschlange stellen.

Der Grund dafür, dass Sie sich nach einiger Zeit selbst beheben, liegt an der Zeitüberschreitung der Anforderung. Sobald die Anfrage abgelaufen ist (weil sie keine Antwort erhalten hat), schließt der Browser die Verbindung.

Browser gleichzeitige Anfrage pro Grenzen Host - https://stackoverflow.com/a/985704/4774345

+0

Große Antwort und Erklärung! Hatte keine Idee chrome gestoppt alle ausgehenden Anfragen bei 6 – JonLuca

+0

Dies behob es. Vielen Dank. Um es klar zu stellen: Chrome erlaubt nur 6 gleichzeitige Anfragen, aber nach meiner Serverantwort fällt diese Zahl wieder auf 0 bin ich richtig? – Preprocezzor

+0

@Preprocezzor Ja. Jedes Mal, wenn Ihr Server auf die Anfrage reagiert, schließt der Browser diese Verbindung zum Server. – dan

1
$('#car').click(function(){ 

    $.ajax({ 
     type:'POST', 
     async : true, 
     url: url + '/drive' 
    }); 

Sie müssen asynchron sie senden.

2

Der Server-Code sollte Anweisung zurück:

app.post('/drive', function(req, res){ 
    console.log('Car starts driving'); 
    res.sendStatus(sendStatus) 
}); 

sendStatus details

Gute Praxis ist auf die Schaltfläche klicken, deaktivieren und aktivieren Sie es dann nach Die Antwort kommt zurück:

// Deaktivieren Sie die Schaltfläche

$.ajax({ 
    url: url + '/drive'   
    type: 'POST',   
    data: {}, 
    success: function(data){ 
     //Enable button 
    }, 
    error: function(data){ 
     //Enable button 
    } 
});