2011-12-22 26 views
7

Tengo una situación en la que necesito que ocurran múltiples renders con el mismo objeto de respuesta en una aplicación ExpressJS. (Básicamente, una solicitud HTTP desencadena múltiples solicitudes de back-end, todas las cuales pueden comenzar a mostrar los resultados en la página de manera inmediata a medida que se completan). El problema es que necesito que cada uno represente una vista (es decir, no creo que pueda usar res.write()), y hasta donde puedo decir, no hay forma de que res.render() no finalicen la respuesta ni escriban encabezados cada vez que se invoca.¿Cómo renderizar varias veces en el mismo objeto de respuesta con ExpressJS?

¿Qué me estoy perdiendo?

+1

¿Cómo se puede responder dos veces a una sola solicitud HTTP? –

+0

No responde dos veces; es solo que quiero poder transmitir la salida a la página desde múltiples funciones. La solicitud HTTP da como resultado varias llamadas API a otros servicios que generan partes de la respuesta. En lugar de esperar a que todos respondan y visualicen la página todo de una vez, quiero que el objeto de respuesta permanezca "abierto" para poder escribir las vistas (más exactamente una vista parciales) hasta que se completen todas las llamadas API. –

+0

Ah, 'res.write' va a ser tu única opción entonces. Por supuesto, también existe la opción de cargar parte de la página a través de 'res.render', y luego usar AJAX para cargar el resto. –

Respuesta

8

expreso compila la plantilla mediante un motor como EJS, etc. Jade

Los datos se hace a continuación, utilizando response.send: https://github.com/visionmedia/express/blob/master/lib/response.js#L76-131

Como se puede ver que, al final hay this.end..., que significa respuesta .nd (...).

Si desea lograr el envío de varias vistas, debe compilar esas vistas usted mismo utilizando el motor de vista y luego crear una función similar a response.send (que le di el enlace anterior), pero tenga cuidado de no enviar el encabezados dos veces o llamar a response.end antes de que se muestre la última vista.

+3

He aceptado esta respuesta porque es la solución más adecuada desde el punto de vista técnico. En mi caso, rediseñé la forma en que hacía múltiples llamadas para agregar las respuestas y solo renderizar una vez porque me parecía que era un mejor enfoque. Sin embargo, la orientación de alessioalex es perfecta para cualquiera que quiera acercarse a esto: el puntero al código está exactamente donde debe comenzar. –

Cuestiones relacionadas