web-dev-qa-db-fra.com

Différence entre response.send et response.write dans le noeud js

J'ai écrit une petite API qui utilise le framework Node js "restify". Cette API reçoit une demande (en réalité tout ce qui suit "/"), puis envoie cette demande à un autre serveur. Obtenez la réponse. retour du serveur et renvoie la réponse à la source d'origine de la demande.Pour cette API, j'utilise à la fois restify serveur et client.

Vous trouverez ci-dessous le code de l’API pour une meilleure compréhension.

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;

Maintenant, j'ai besoin de connaître la différence entre response.write Et response.send De Node.js. Parce qu'avec response.write, Je peux définir un en-tête et l'écrire, mais il est impossible de faire quoi que ce soit avec des en-têtes lorsque j'utilise response.send. Quand j'utilise response.send Avec setHeader() ou writeHeader(), j'obtiens cette erreur:

http.js: 691 
 génère une nouvelle erreur ('Impossible de définir les en-têtes après leur envoi.'); 
 ^ 
 Erreur: impossible de définir les en-têtes après leur envoi. envoyé.

Il y a aussi une autre chose. Avec response.send(), je reçois la sortie HTML complète à l’écran de la manière suivante:

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

Mais avec response.write, Je n'ai pas le code HTML à l'écran, mais seulement le texte "bla bla bla".

Ce serait formidable si quelqu'un peut m'expliquer les différences.

53
user3275959

Je ne trouve pas response.send() dans docs , mais je suppose que .send() remplira et enverra la réponse; elle ne pourra donc être appelée qu'une fois, alors que .write() va juste écrire la réponse, mais vous devez l'envoyer en utilisant response.end()

Cela signifie que vous pouvez modifier les en-têtes à l'aide de .write() car la réponse n'a pas encore été envoyée.

[~ # ~] éditer [~ # ~] :

response.send() fait partie du encapsuleur de Restify Response API

35
Jim Jeffries

response.send(msg) est égal à response.write(msg);response.end();

Ce qui signifie que send ne peut être appelé qu'une seule fois, write peut être appelé plusieurs fois, mais vous devez appeler vous-même end.

62
Flying Fisher

res.send() fait partie de Express.js au lieu de pure Node.js.

Juste une observation de côté. Mon application renvoie parfois un très grand objet Json (HighChart qui contient plus de 100 000 points). Avec res.send(), parfois, il se bloque et étouffe le serveur, alors que res.write() et res.end() le gèrent parfaitement.

J'ai également remarqué un pic de mémoire lorsque res.send() est appelé.

29
Gäng Tian

J'essayais d'envoyer d'énormes données texte (295 Mo) sur http en utilisant res.send (données) et res.write (données). J'ai remarqué que res.send (data) est plus lent que res.write (data). J'ai observé les choses suivantes.

res.send (data): il ne peut être appelé qu'une seule fois et envoie des données sous forme de bloc d'une taille de mémoire tampon au client, puis revient à nouveau et envoie un autre bloc de taille de mémoire tampon va-et-vient la communication http.

res.write (data): Il peut être appelé plusieurs fois, suivi de res.end (). Il crée une taille de mémoire tampon basée sur des données complètes et l'envoie via http afin qu'il soit plus rapide en cas de quantités énormes. de données.

1
Shashi3456643