Qual è la differenza tra res.end () e res.send ()?


141

Sono un principiante Express.jse sono confuso da queste due parole chiave: res.end()e res.send().

Sono uguali o diversi?


1
Penso che sia res.endusato da un semplice nodo dove res.sendè usato da espresso framwork
Muhammad Umer Idreesi,

Risposte:


130

res.send()invierà la risposta HTTP. La sua sintassi è,

res.send([body])

Il parametro body può essere un oggetto Buffer, una stringa, un oggetto o una matrice. Per esempio:

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' });

Vedi questo per maggiori informazioni.

res.end()terminerà il processo di risposta. Questo metodo in realtà proviene dal Node core, in particolare il response.end()metodo di http.ServerResponse. Viene utilizzato per terminare rapidamente la risposta senza dati. Per esempio:

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

Leggi questo per maggiori informazioni.


68
Ma res.end può effettivamente agire come res.send, in quanto è possibile passare un argomento stringa da aggiungere come corpo della risposta. Inoltre, res.send termina anche la risposta. Quindi, come sono funzionalmente diversi?
saltthehash,

31
@ psytech140 Jmar77 ha avuto una buona risposta qui : "Se si passa una stringa a res.send (), assume automaticamente un Content-Type di html. res.end (), tuttavia chiama semplicemente l'implementazione end () sottostante del nodo sul flusso di risposta, quindi non vengono fatte ipotesi per il Content-Type. "
abagh0703

Ho dovuto votare questo puramente perché non l'ho mai usato, expressma dal titolo pensato: uno invia qualcosa, uno finisce qualcosa ... è giusto.
Darren Bartrup-Cook

Ma cosa succede se si utilizza solo res.send()con niente. Questo si comporta res.end()?
CMCDragonkai


108

Vorrei porre un po 'più di enfasi su alcune differenze chiave tra res.end()e res.send()rispetto alle intestazioni di risposta e perché sono importanti.

1. res.send () verificherà la struttura dell'output e imposterà le informazioni dell'intestazione di conseguenza.


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

inserisci qui la descrizione dell'immagine


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

inserisci qui la descrizione dell'immagine

Dove con res.end () puoi solo rispondere con il testo e non imposterà " Content-Type "

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

inserisci qui la descrizione dell'immagine

2. res.send () imposterà l'attributo "ETag" nell'intestazione della risposta

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

inserisci qui la descrizione dell'immagine

¿Perché questo tag è importante?
L'intestazione della risposta HTTP ETag è un identificatore per una versione specifica di una risorsa. Consente alle cache di essere più efficienti e consente di risparmiare larghezza di banda, in quanto un server Web non deve inviare una risposta completa se il contenuto non è cambiato.

res.end() NON imposterà questo attributo di intestazione


4
Questa sarà una risposta accettata a mio avviso ... viene fatta maggiore enfasi sulle differenze effettive che possono rovinare la giornata lavorativa invece della discussione sulla fine della risposta con / senza contenuto ...
Tomas

13

ciò che fa res.send () è implementare res.write , res.setHeaders e res.end .
controlla quali sono i dati inviati e imposta le intestazioni corrette,

quindi trasmette i dati con res.write e alla fine usa res.end per impostare la fine della richiesta.

ci sono alcuni casi in cui vorrai farlo manualmente, ad esempio se vuoi eseguire lo streaming di file o un set di dati di grandi dimensioni, in questo caso vorrai impostare le intestazioni da solo e utilizzare res.write per mantenere lo stream flusso.


0

resè un oggetto HttpResponse che si estende da OutgoingMessage. res.sendchiamate res.endimplementate da OutgoingMessage per inviare la risposta HTTP e chiudere la connessione. Vediamo il codice qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.