2013-07-14 13 views
5

Cercai il web e la documentazione per il modulo node.jsexpress e sembra che non ci sia modo di inviare dati per parti. Ho un file renderizzato non molto veloce e voglio inviare parti di esso prima che tutto sia reso.Invia dati per parti in node.js express

Così qui sono le mie domande:

  1. Esiste un metodo su response per inviare i dati da parti?
  2. Che cosa significa response.end()?
  3. Se non c'è modo di inviare dati per parti: qual è la logica alla base? Direi che sembra più bloccante del non-blocco se è vero. Il browser può caricare le informazioni più velocemente se i dati vengono forniti in precedenza.

Esempio codice semplificato:

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

Questo pezzo di codice invia solo il primo blocco di dati. Ho controllato - dati è dato correttamente e il callback è chiamato più di una volta.

Ovviamente posso aggiungere dati a una variabile e quindi scrivere response.send(data); ma non mi piace questo approccio, non è il modo in cui dovrebbe funzionare.

risposta

9

L'oggetto response è un flusso scrivibile. Basta scrivere su di esso, e Express potrà anche impostare automaticamente la codifica Chunked.

response.write(chunk); 

Si può anche eseguire il pipe su di esso se qualsiasi cosa sta creando questo "file" si presenta come un flusso leggibile. http://nodejs.org/api/stream.html

+0

Si prega di elaborare sulla tubazione e dare un esempio. Ritengo che questo sarebbe molto rilevante per molte persone, in quanto è in realtà una soluzione migliore in molti casi. –

+0

@NielsAbildgaard Non riesco a dare un esempio specifico perché il codice nella domanda non fornisce alcun contesto sulla provenienza dei dati. 'sourceStream.pipe (response)' farà il trucco. – Brad

1

Express estende Connect che estende HTTP credo. Guardando il HTTP API, sembra che quello che stai cercando è response.write, che prende una porzione di dati da inviare come corpo di risposta. Credo quindi che tu possa usare response.end sul segnale finale.

0

L'oggetto risposta può essere scritto su. Nel tuo caso, il seguente sarebbe una soluzione:

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

Se avete la possibilità di ottenere il file come un flusso questo può essere razionalizzato ulteriormente:

file.getReadableStream().pipe(response);