Quelle est la différence entre res.end () et res.send ()?

141

Je suis un débutant en Express.js et je suis confus par ces deux mots-clés: res.end()et res.send().

Sont-ils identiques ou différents?

sudheeshcm
la source
1
Je pense qu'il est res.endutilisé par un nœud simple où res.sendest utilisé par un cadre express
Muhammad Umer Idreesi

Réponses:

130

res.send()enverra la réponse HTTP. Sa syntaxe est,

res.send([body])

Le paramètre body peut être un objet Buffer, une chaîne, un objet ou un tableau. Par exemple:

res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });

Voir ceci pour plus d'informations.

res.end()mettra fin au processus de réponse. Cette méthode provient en fait du noyau Node, en particulier de la response.end()méthode de http.ServerResponse. Il est utilisé pour terminer rapidement la réponse sans aucune donnée. Par exemple:

res.end();
res.status(404).end();

Lisez ceci pour plus d'informations.

itzmebibin
la source
69
Mais res.end peut en fait agir comme res.send, en ce sens que vous pouvez passer un argument de chaîne à ajouter comme corps de réponse. En plus de cela, res.send termine également la réponse. Alors, en quoi sont-ils fonctionnellement différents?
saltthehash
31
@ psytech140 Jmar77 a eu une bonne réponse ici : "Si vous passez une chaîne à res.send (), il suppose automatiquement un Content-Type de html. res.end (), cependant, appelle simplement l'implémentation end () sous-jacente du nœud sur le flux de réponse, donc aucune hypothèse n'est faite pour le Content-Type. "
abagh0703
J'ai dû voter pour cela uniquement parce que je n'ai jamais utilisé, expressmais à partir de la pensée du titre - on envoie quelque chose, on termine quelque chose ...
Darren Bartrup-Cook
Mais que faire si vous utilisez simplement res.send()avec rien. Cela agit-il comme res.end()?
CMCDragonkai
Voir la différence à la réponse ci-dessous et ce qui s'est passé sous le capot
KunYu Tsai
108

Je voudrais mettre un peu plus l'accent sur certaines différences clés entre res.end()et en ce res.send()qui concerne les en-têtes de réponse et pourquoi ils sont importants.

1. res.send () vérifiera la structure de votre sortie et définira les informations d'en-tête en conséquence.


    app.get('/',(req,res)=>{
       res.send('<b>hello</b>');
    });

entrez la description de l'image ici


     app.get('/',(req,res)=>{
         res.send({msg:'hello'});
     });

entrez la description de l'image ici

Où avec res.end () vous ne pouvez répondre qu'avec du texte et il ne définira pas " Content-Type "

      app.get('/',(req,res)=>{
           res.end('<b>hello</b>');
      }); 

entrez la description de l'image ici

2. res.send () définira l'attribut "ETag" dans l'en-tête de la réponse

      app.get('/',(req,res)=>{
            res.send('<b>hello</b>');
      });

entrez la description de l'image ici

¿Pourquoi cette balise est-elle importante?
L'en-tête de réponse HTTP ETag est un identifiant pour une version spécifique d'une ressource. Cela permet aux caches d'être plus efficaces et d'économiser de la bande passante, car un serveur Web n'a pas besoin d'envoyer une réponse complète si le contenu n'a pas changé.

res.end() ne définira PAS cet attribut d'en-tête

Jorge González
la source
4
Cela doit être une réponse acceptée à mon avis ... plus de détails sont faits sur les différences réelles qui peuvent ruiner votre journée de travail au lieu de discuter sur la fin de la réponse avec / sans contenu ...
Tomas
13

ce que fait res.send () est d'implémenter res.write , res.setHeaders et res.end .
il vérifie quelles sont les données que vous envoyez et définissez les en-têtes corrects,

puis son flux les données avec res.write, et à la fin il utilise res.end pour définir la fin de la demande.

dans certains cas, vous voudrez le faire manuellement, par exemple si vous voulez diffuser un fichier ou un ensemble de données volumineux, dans ce cas, vous voudrez définir les en-têtes par vous-même et utiliser res.write afin de conserver le flux couler.

Amit Wagner
la source
0

resest un objet HttpResponse qui s'étend de OutgoingMessage. res.sendappels res.endqui sont implémentés par OutgoingMessage pour envoyer une réponse HTTP et fermer la connexion. Nous voyons le code ici

Pylône
la source