2014-08-28 14 views
14

3 Jahren konnte ich mehrere res.send in express.js tun.
Schreiben Sie sogar ein setTimeout, um eine Live-Ausgabe anzuzeigen.kann nicht mehrere res.send in express.js

response.send('<script class="jsbin" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>'); 
response.send('<html><body><input id="text_box" /><button>submit</button></body></html>'); 
var initJs = function() { 
    $('.button').click(function() { 
    $.post('/input', { input: $('#text_box').val() }, function() { alert('has send');}); 
    }); 
} 
response.send('<script>' + initJs + '</script>'); 

Jetzt wird es werfen:

Error: Can't set headers after they are sent 

Ich weiß NodeJS und Express aktualisiert haben. Warum kann ich das jetzt nicht tun? irgendeine andere Idee?


Fand die Lösung aber "res.write" ist nicht in api Referenz http://expressjs.com/4x/api.html ...

: S

Antwort

29

Vielleicht benötigen Sie: response.write

response.write("foo"); 
response.write("bar"); 
//... 
response.end() 

res.send ruft implizit res.write gefolgt von res.end auf. Wenn Sie mehrere Male res.send aufrufen, wird es das erste Mal funktionieren. Da jedoch der erste res.send-Aufruf die Antwort beendet, können Sie der Antwort nichts hinzufügen.

+0

Ja, das hört sich so an, als würde er wahrscheinlich daran denken. Ich habe Nodes Antwort vollständig vergessen. Mein Gehirn war in Expressland:/ –

+2

Cool, das will ich. Aber, warum es nicht in einer API-Referenz ist http://expressjs.com/4x/api.html#res.send ??? – emj365

+0

Vielleicht, weil wir 'res.render' oder' res.send' verwenden sollten, verwende ich 'res.write', als ich noch ein Neuling war. @ emj365 warum nicht versuchen 'res.render'? – osrpt

11

response.send sendet eine gesamte HTTP-Antwort an den Client, einschließlich Header und Inhalte, Aus diesem Grund können Sie es nicht mehrmals aufrufen. Tatsächlich beendet es sogar die Antwort, so dass response.end nicht explizit aufgerufen werden muss, wenn response.send verwendet wird.

Es scheint mir, dass Sie versuchen, send wie einen Puffer zu verwenden: Schreiben Sie es mit der Absicht, später zu spülen. So funktioniert die Methode jedoch nicht; Sie müssen Ihre Antwort im Code aufbauen und dann einen einzigen send Anruf tätigen.

Leider kann ich nicht sprechen, warum oder wenn diese Änderung vorgenommen wurde, aber ich weiß, dass es so zumindest seit Express war 3.

Verwandte Themen