Apa perbedaan antara res.end () dan res.send ()?

154

Saya seorang pemula Express.jsdan saya bingung dengan dua kata kunci ini: res.end()dan res.send().

Apakah mereka sama atau berbeda?

sudheeshcm
sumber
1
Saya pikir res.enddigunakan oleh simpul biasa dimana seperti res.sendyang digunakan oleh kerangka ekspres
Muhammad Umer Idreesi

Jawaban:

140

res.send()akan mengirimkan tanggapan HTTP. Sintaksnya adalah,

res.send([body])

Parameter body dapat berupa objek Buffer, String, objek, atau Array. Sebagai contoh:

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

Lihat ini untuk info lebih lanjut.

res.end()akan mengakhiri proses tanggapan. Metode ini sebenarnya berasal dari inti Node, khususnya response.end()metode http.ServerResponse. Ini digunakan untuk mengakhiri respons dengan cepat tanpa data apa pun. Sebagai contoh:

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

Baca ini untuk info lebih lanjut.

itzmebibin.dll
sumber
76
Tapi res.end sebenarnya bisa bertindak seperti res.send, di mana Anda bisa meneruskan argumen string untuk ditambahkan sebagai isi respons. Selain itu, res.send juga mengakhiri responnya. Jadi bagaimana mereka berbeda secara fungsional?
Saltthehash
33
@ psytech140 Jmar77 mendapat respons yang bagus di sini : "Jika Anda meneruskan string ke res.send (), secara otomatis mengasumsikan Jenis Konten html. res.end (), namun, cukup memanggil implementasi end () yang mendasari node pada aliran respons, jadi tidak ada asumsi yang dibuat untuk Jenis Konten. "
abagh0703
Harus meningkatkan ini murni karena saya tidak pernah menggunakan expresstetapi dari pemikiran judul - seseorang mengirim sesuatu, satu mengakhiri sesuatu .... 'sangat benar.
Darren Bartrup-Cook
Tetapi bagaimana jika Anda hanya menggunakan res.send()tanpa apa-apa. Apakah ini bertindak seperti itu res.end()?
CMCDragonkai
Lihat perbedaan pada jawaban di bawah ini dan apa yang terjadi di balik
terpal
121

Saya ingin lebih menekankan pada beberapa perbedaan utama antara res.end()& res.send()sehubungan dengan tajuk tanggapan dan mengapa hal itu penting.

1. res.send () akan memeriksa struktur keluaran Anda dan mengatur informasi header yang sesuai.


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

masukkan deskripsi gambar di sini


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

masukkan deskripsi gambar di sini

Dimana dengan res.end () Anda hanya dapat merespon dengan teks dan itu tidak akan mengatur " Jenis-Konten "

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

masukkan deskripsi gambar di sini

2. res.send () akan menyetel atribut "ETag" di header respons

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

masukkan deskripsi gambar di sini

¿Mengapa tag ini penting?
Header respons HTTP ETag adalah pengenal untuk versi sumber daya tertentu. Ini memungkinkan cache menjadi lebih efisien, dan menghemat bandwidth, karena server web tidak perlu mengirim respons penuh jika konten tidak berubah.

res.end() TIDAK akan menyetel atribut tajuk ini

Jorge González
sumber
5
Ini akan menjadi jawaban yang diterima menurut saya ... lebih banyak amphasis dibuat pada perbedaan nyata yang dapat merusak hari kerja Anda daripada diskusi tentang mengakhiri tanggapan dengan / tanpa konten ...
Tomas
13

apa yang dilakukan res.send (), adalah mengimplementasikan res.write , res.setHeaders dan res.end .
itu memeriksa data apa yang Anda kirim dan mengatur header yang benar,

lalu mengalirkan data dengan res.write, dan pada akhirnya menggunakan res.end untuk menyetel akhir permintaan.

ada beberapa kasus yang ingin Anda lakukan secara manual misalnya jika Anda ingin melakukan streaming file atau kumpulan data yang besar, dalam kasus ini Anda ingin mengatur header sendiri dan menggunakan res.write untuk tetap streaming mengalir.

Amit Wagner
sumber
1

resadalah objek HttpResponse yang diturunkan dari OutgoingMessage. res.sendpanggilan res.endyang diimplementasikan oleh OutgoingMessage untuk mengirim respons HTTP dan menutup koneksi. Kami melihat kode di sini

Tiang
sumber