2013-07-14 6 views
5

Ich suchte das Web und die Dokumentation für node.jsexpress Modul und es scheint, gibt es keine Möglichkeit, Daten nach Teilen zu senden. Ich habe eine Datei nicht sehr schnell gerendert und ich möchte Teile davon senden, bevor alles gerendert wird.Senden Sie Daten nach Teilen in node.js express

hier sind also meine Fragen:

  1. Gibt es eine Methode auf response Daten durch Teile zu schicken?
  2. Was bedeutet response.end()?
  3. Wenn es keine Möglichkeit gibt, Daten nach Teilen zu senden - was ist der Grund dafür? Ich würde sagen, es sieht eher blockierend als nicht blockierend aus, wenn das stimmt. Der Browser kann Informationen schneller laden, wenn Daten früher angegeben werden.

Probe vereinfacht Code:

app.get(..) { 
    renderFile(file, function(data) { 
    response.send(data); 
    }); 
    response.end(); 
) 

Dieses Stück Code nur den ersten Datenblock sendet. Ich habe überprüft - Daten ist richtig angegeben und Callback wird mehr als einmal aufgerufen.

Natürlich kann ich Daten an die eine Variable anhängen und dann schreiben response.send(data);, aber ich mag diesen Ansatz nicht - es ist nicht die Art, wie es funktionieren sollte.

Antwort

9

Das Objekt response ist ein beschreibbarer Stream. Schreiben Sie einfach darauf, und Express wird sogar die Chunked-Codierung automatisch für Sie einrichten.

Sie können auch eine Pipeline erstellen, wenn das, was diese "Datei" erstellt, sich als lesbarer Stream darstellt. http://nodejs.org/api/stream.html

+0

Bitte an der Rohrleitung erarbeiten und eine geben Beispiel. Ich denke, dies wäre für viele Menschen sehr relevant, da es in vielen Fällen eine bessere Lösung ist. –

+0

@NielsAbildgaard Ich kann kein konkretes Beispiel geben, da der Code in der Frage keinen Kontext dafür liefert, woher die Daten kommen. 'sourceStream.pipe (response)' wird den Trick machen. – Brad

1

Express erweitert Connect, die HTTP erweitert glaube ich. Mit Blick auf die HTTP API, scheint es, dass was Sie suchen, ist response.write, die ein Stück Daten als Antwort Körper zu senden braucht. Ich glaube dann, dass Sie response.end auf das Ende-Signal verwenden können.

0

Das Antwortobjekt kann geschrieben werden. In Ihrem Fall wäre folgendes eine Lösung sein:

renderFile(file, function(data) { 
    response.send(data); 
}); 
response.end(); 

Wenn Sie die Möglichkeit haben, die Datei als Stream zu bekommen dies weiter rationalisiert werden kann:

file.getReadableStream().pipe(response); 
Verwandte Themen