Differenza tra response.send e response.write nel nodo js

Ho scritto una piccola API che usa il framework “restify” del nodo js. Questa API riceve una richiesta (in realtà qualsiasi cosa dopo “/”) e quindi invia tale richiesta a un altro server. Recupera la risposta dal server e restituisce la risposta alla fonte originale di richiesta. Per questa API sto usando sia il server che il client di restify.

Di seguito è riportato il codice API per una migliore comprensione.

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; 

Ora ho bisogno di conoscere la differenza tra response.write e response.send di Node.js. Perché con response.write posso impostare l’intestazione e scrivere in essa ma non è ansible fare nulla con le intestazioni quando uso response.send . Quando uso response.send con setHeader() o writeHeader() ottengo questo errore:

  http.js: 691
     lanciare un nuovo errore ('Imansible impostare le intestazioni dopo che sono state inviate.');
           ^
     Errore: imansible impostare le intestazioni dopo che sono state inviate.

C’è anche un’altra cosa. Con response.send() ottengo l’output HTML completo sullo schermo come:

 \n\n\t ..... "bla bla bla" 

Ma con response.write non ottengo lo html sullo schermo ma solo il testo "bla bla bla" .

    Sarebbe bello se qualcuno potesse spiegarmi le differenze.

    Non riesco a trovare response.send() nei documenti , ma presumo che .send() si compili e invii la risposta in modo che possa essere chiamato una sola volta, mentre .write() semplicemente scriverà la risposta, ma devi invialo usando response.end()

    Ciò significa che puoi modificare le intestazioni usando .write() perché la risposta non è stata ancora inviata.

    MODIFICA :

    response.send() è parte del restify wrapper API di risposta

    response.send(msg) è uguale a response.write(msg);response.end();

    Il che significa che l’ send può essere chiamato solo una volta, write può essere chiamato più volte, ma è necessario chiamare se stessi.

    res.send() è parte di Express.js invece di puro Node.js.

    Solo un’osservazione laterale. A volte la mia app restituisce un object Json molto grande (object HighChart che contiene oltre 100k punti). Con res.send() volte blocca e res.write() il server, mentre res.write() e res.end() gestiscono bene.

    Ho notato anche un picco di memoria quando viene richiamato res.send() .

    Stavo cercando di inviare enormi dati di testo (295 MB) su http utilizzando res.send (dati) e res.write (dati). Ho notato che res.send (dati) è più lento di res.write (dati). Ho osservato le seguenti cose.

    res.send (data): può essere chiamato solo una volta e invia dati in una porzione di dimensione del buffer al client e poi torna di nuovo e invia un altro blocco di dimensioni del buffer, quindi c’è un sacco di avanti e indietro della comunicazione http.

    res.write (data): può essere chiamato più volte seguito da res.end () e crea una dimensione del buffer basata su dati interi e invia su http quindi sarebbe più veloce in caso di enormi quantità di dati.