2012-03-17 15 views
6

Estoy experimentando con varias respuestas de un servidor HTTP NodeJS simple. El efecto que intento lograr es una representación visual más rápida de una página web. Dado que la respuesta se transmite al navegador con transfer-encoding: chunked (¿verdad?), Pensé que podía renderizar el diseño de página primero y el resto de los datos después de un retraso.Transmitiendo respuestas 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'); 

La cosa es que parece como si la respuesta no se envía hasta res.end('world') menos que los datos ya se ha escrito es lo suficientemente largo, por lo que, por ejemplo, en lugar de que res.write(new Array(2000).join('1'))res.write('hello'), haría el truco.

¿Hay memoria en el búfer de mis escrituras hasta que los datos sean lo suficientemente importantes como para enviarlos? Si ese es el caso, ¿el tamaño del fragmento es configurable?

Respuesta

3

Es posible que el navegador no esté procesando los datos hasta que se hayan leído las etiquetas de cierre. Intente generar texto sin formato en lugar de etiquetas html para probar esto.

¿Ve alguna entrada en el inspector Firebug/Chrome?

Related Question

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

Escribe cadena con la codificación dado a la corriente. Devuelve true si la cadena ha sido eliminada del buffer del kernel. Devuelve falso a indica que el buffer del kernel está lleno, y los datos serán enviados en el futuro.

Deje los resultados de los métodos .write(). Ver si devuelve un verdadero o falso.

+0

La salida de .write() es 'verdadera' en ambas ocasiones. Esa pregunta relacionada que vinculó sugiere que esto es específico de la plataforma, ¿alguna idea de lo que eso significaría? El inspector de cromo solo genera el tiempo de respuesta completo, el mismo para ambos casos. Los datos también se representan antes de que se hayan leído las etiquetas de cierre, es el mismo comportamiento cuando se usa solo texto sin formato. – Daniel

+1

Es específico del navegador. Pruébelo en diferentes navegadores. Además, en la pestaña de red del inspector de Chrome, usted debería poder ver los datos entrar en vigencia si recarga la página y hace clic en el primer elemento debajo de la pestaña de red. Asegúrate de seleccionar la pestaña de vista previa en el panel de la derecha: esto es de lo que estoy hablando: http://imgur.com/8CJD1 – Straseus

+0

Sí, parece que es el navegador que almacena la respuesta. Intenté ejecutar la solicitud con curl y eso produjo el comportamiento esperado, (aunque curl parecía amortiguar si la respuesta carecía de terminaciones de línea '\ n') – Daniel

Cuestiones relacionadas