skeleton log createserver javascript node.js restify

javascript - log - restify vs express



Diferencia entre response.send y response.write en el nodo js (4)

He escrito una pequeña API que utiliza el marco "restify" de Node js. Esta API recibe una solicitud (en realidad, después de "/") y luego envía esa solicitud a otro servidor. Obtenga la respuesta del servidor y transfiera la respuesta a la fuente original de la solicitud. Para esta API estoy usando tanto el servidor como el cliente de Restify.

A continuación se muestra ese código API para una mejor comprensión.

var apiServer = require(''apiServer''); apiServer.start(); var restify = require(''restify''); var assert = require(''assert''); function onRequest(request, response, next) { var client = restify.createStringClient({ url: ''http://example.com'' }); client.get(''/'' + request.params[0], function(err, req, res, data) { assert.ifError(err); response.setHeader(''Content-Type'', ''text/html''); response.writeHead(res.statusCode); response.write(data); response.end(); }); next(); } function start() { var server = restify.createServer(); server.get(/^//(.*)/, onRequest); server.listen(8888); console.log("Server has started."); } exports.start = start;

Ahora necesito saber la diferencia entre response.write y response.send de Node.js. Porque con response.write puedo configurar el encabezado y escribir en él, pero no puedo hacer nada con los encabezados cuando uso response.send . Cuando uso response.send con setHeader() o writeHeader() obtengo este error:

http.js:691 throw new Error(''Can/'t set headers after they are sent.''); ^ Error: Can''t set headers after they are sent.

También hay otra cosa. Con response.send() obtengo la salida HTML completa en la pantalla como:

<!DOCTYPE html>/n<html>/n/t<head></head></html> ..... "bla bla bla"

Pero con response.write no obtengo el html en la pantalla, solo el texto "bla bla bla" .

Sería genial si alguien me pudiera explicar las diferencias.


Intentaba enviar datos de texto de gran tamaño (295 mb) a través de http mediante res.send (datos) y res.write (datos). Noté que res.send (data) es más lento que res.write (data). Observé las siguientes cosas.

res.send (datos): se puede llamar solo una vez y envía datos en una porción de un tamaño de búfer al cliente y luego vuelve a aparecer y envía otra porción de tamaño de búfer por lo que hay mucha comunicación http de ida y vuelta.

res.write (datos): se puede llamar varias veces seguido de res.end () y crea un tamaño de búfer basado en datos completos y se envía a través de http para que sea más rápido en caso de una gran cantidad de datos.


No puedo encontrar response.send() en los docs , pero asumo que .send() completará y enviará la respuesta, por lo que solo se puede llamar una vez, mientras que .write() solo escribirá la respuesta, pero hay que enviarlo utilizando response.end()

Esto significa que puede editar los encabezados utilizando .write() porque la respuesta aún no se ha enviado.

EDITAR :

response.send() es parte del contenedor de la API de respuesta restify


res.send() es parte de Express.js en lugar de Node.js puro.

Solo una observación lateral. Mi aplicación a veces devuelve un objeto Json muy grande (objeto HighChart que contiene más de 100k puntos). Con res.send() veces cuelga y ahoga el servidor, mientras que res.write() y res.end() manejan bien.

También noté un pico de memoria cuando se invoca res.send() .


response.send(msg) es igual a response.write(msg);response.end();

Lo que significa que send solo puede llamarse una vez, write puede llamarse muchas veces, pero debes llamar a end .