2012-03-17 30 views
6

Sto sperimentando varie risposte da un semplice server HTTP NodeJS. L'effetto che sto cercando di ottenere è il rendering visivo più veloce di una pagina web. Dal momento che la risposta viene trasmessa al browser con transfer-encoding: chunked (giusto?) Stavo pensando che avrei potuto rendere il layout della pagina prima e il resto dei dati dopo un ritardo.Streaming di risposte Http con NodeJS

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, { 
     'Content-Type': 'text/html' 
     , 'Transfer-Encoding': 'chunked' 
    }); 
    res.write('<html>\n'); 
    res.write('<body>\n'); 
    res.write('hello '); 
    res.write('</body>\n'); 
    res.write('</html>\n'); 
    setTimeout(function() { 
     res.end('world'); 
    },1500); 
}).listen(3000, '127.0.0.1'); 

Il fatto è che sembra come se la risposta non viene inviata fino res.end('world') meno che i dati già scritto è abbastanza lungo, quindi per esempio res.write(new Array(2000).join('1')) al posto di quella res.write('hello'), farebbe il trucco.

Il nodo esegue il buffering delle mie scritture finché i dati non sono abbastanza grandi per essere inviati? In questo caso, la dimensione del blocco è configurabile?

risposta

3

È possibile che il browser non esegua il rendering dei dati finché non sono stati letti i tag di chiusura. Prova a fornire testo semplice invece di tag html per verificarlo.

Vedi qualche input in firebug/chrome inspector?

Related Question

http://nodejs.org/api/stream.html#stream_stream_write_string_encoding_fd:

Scrive stringa con il dato di codifica al flusso. Restituisce true se la stringa è stata svuotata nel buffer del kernel. Restituisce false a indica che il buffer del kernel è pieno e in futuro i dati verranno inviati .

Quindi inviare i risultati dei metodi .write(). Vedi se restituisce un valore vero o falso.

+0

L'output di .write() è 'true' entrambe le volte. Quella domanda correlata che hai collegato suggerisce che questa è una piattaforma specifica, qualche idea su cosa significherebbe? L'ispettore di cromo emette solo il tempo di risposta completato, lo stesso per entrambi i casi. I dati vengono anche visualizzati prima della lettura dei tag di chiusura, è lo stesso comportamento quando si utilizza solo il testo normale. – Daniel

+1

È specifico per il browser. Provalo in diversi browser. Inoltre, nella scheda di rete dell'ispettore Chrome, dovresti essere in grado di vedere i dati arrivare in diretta se ricarichi la pagina e fai clic sul primo elemento sotto la scheda di rete. Assicurati di selezionare la scheda di anteprima sul pannello di destra: ecco di cosa sto parlando: http://imgur.com/8CJD1 – Straseus

+0

Sì, sembra proprio che sia il browser a tamponare la risposta. Ho provato a eseguire la richiesta con curl e questo ha prodotto il comportamento previsto, (sebbene il ricciolo sembrasse bufferizzare se la risposta mancava di terminazioni di riga '\ n') – Daniel

Problemi correlati