Was ist der Unterschied zwischen res.end () und res.send ()?

140

Ich bin ein Anfänger in Express.jsund ich bin durch diese beiden Schlüsselwörter verwirrt: res.end()und res.send().

Sind sie gleich oder verschieden?

sudheeshcm
quelle
1
Ich denke res.end, von einfachen Knoten verwendet, wo wie res.sendvon Express-Rahmen verwendet wird
Muhammad Umer Idreesi

Antworten:

128

res.send()sendet die HTTP-Antwort. Seine Syntax lautet:

res.send([body])

Der body-Parameter kann ein Pufferobjekt, ein String, ein Objekt oder ein Array sein. Beispielsweise:

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

Sehen Sie diese für weitere Informationen.

res.end()beendet den Antwortprozess. Diese Methode stammt tatsächlich aus dem Knotenkern, insbesondere der response.end()Methode von http.ServerResponse. Es wird verwendet, um die Antwort ohne Daten schnell zu beenden. Beispielsweise:

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

Lesen Sie dies für weitere Informationen.

Itzmebibin
quelle
68
Aber res.end kann sich tatsächlich wie res.send verhalten, indem Sie ein String-Argument übergeben können, das als Antworttext hinzugefügt werden soll. Darüber hinaus beendet res.send auch die Antwort. Wie unterscheiden sie sich funktional?
Saltthehash
31
@ psytech140 Jmar77 eine nette Antwort hatte hier : „Wenn Sie eine Zeichenfolge an res.send () übergeben, nimmt es automatisch eine Content-Type von html res.end (), jedoch ruft einfach zugrunde liegendes Ende () Implementierung des Knotens auf dem. Antwortstrom, daher werden keine Annahmen für den Inhaltstyp getroffen. "
Abagh0703
Musste dies nur deshalb positiv bewerten, weil ich es nie benutzt habe, expressaber aus dem Titelgedanke - man schickt etwas, man beendet etwas ... 'Es war richtig.
Darren Bartrup-Cook
Aber was ist, wenn Sie nur res.send()mit nichts verwenden. Handelt das so res.end()?
CMCDragonkai
Sehen Sie den Unterschied unter Antwort und was unter der Haube passiert ist
KunYu Tsai
108

Ich möchte einige wichtige Unterschiede zwischen res.end()& res.send()in Bezug auf Antwortheader und deren Bedeutung etwas stärker hervorheben .

1. res.send () überprüft die Struktur Ihrer Ausgabe und legt die Header-Informationen entsprechend fest.


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

Geben Sie hier die Bildbeschreibung ein


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

Geben Sie hier die Bildbeschreibung ein

Wo mit res.end () Sie nur mit Text antworten können und es nicht " Content-Type " setzt

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

Geben Sie hier die Bildbeschreibung ein

2. res.send () setzt das Attribut "ETag" im Antwortheader

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

Geben Sie hier die Bildbeschreibung ein

¿Warum ist dieses Tag wichtig?
Der ETag-HTTP-Antwortheader ist eine Kennung für eine bestimmte Version einer Ressource. Dadurch können Caches effizienter gestaltet und Bandbreite gespart werden, da ein Webserver keine vollständige Antwort senden muss, wenn sich der Inhalt nicht geändert hat.

res.end() setzt dieses Header-Attribut NICHT

Jorge González
quelle
4
Diese Antwort wird meiner Meinung nach akzeptiert ... Es wird mehr Wert auf tatsächliche Unterschiede gelegt, die Ihren Arbeitstag ruinieren können, anstatt über die Beendigung der Antwort mit / ohne Inhalt zu diskutieren ...
Tomas
13

res.send () implementiert res.write , res.setHeaders und res.end .
Es überprüft, welche Daten Sie senden, und legt die richtigen Header fest.

Anschließend werden die Daten mit res.write gestreamt, und am Ende wird res.end verwendet, um das Ende der Anforderung festzulegen.

In einigen Fällen möchten Sie dies manuell tun, z. B. wenn Sie eine Datei oder einen großen Datensatz streamen möchten. In diesem Fall möchten Sie die Header selbst festlegen und res.write verwenden, um den Stream beizubehalten fließen.

Amit Wagner
quelle
0

resist ein HttpResponse-Objekt, das sich von OutgoingMessage erstreckt. res.sendAufrufe, res.enddie von OutgoingMessage implementiert werden, um eine HTTP-Antwort zu senden und die Verbindung zu schließen. Wir sehen hier Code

Pylon
quelle