res.end () และ res.send () ต่างกันอย่างไร?


154

ฉันเป็นมือใหม่Express.jsและฉันสับสนกับคำหลักสองคำนี้: res.end()และres.send().

เหมือนหรือต่างกันอย่างไร


1
ฉันคิดว่าres.endใช้โดยโหนดธรรมดาที่res.sendใช้โดย
เฟรมเวิร์ก

คำตอบ:


140

res.send()จะส่งการตอบกลับ HTTP ไวยากรณ์ของมันคือ

res.send([body])

พารามิเตอร์ body สามารถเป็นวัตถุ Buffer, String, วัตถุหรือ Array ตัวอย่างเช่น:

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

ดูนี้สำหรับข้อมูลเพิ่มเติม

res.end()จะสิ้นสุดกระบวนการตอบกลับ วิธีนี้มาจาก Node core โดยเฉพาะresponse.end()วิธีการhttp.ServerResponse. ใช้เพื่อยุติการตอบสนองอย่างรวดเร็วโดยไม่มีข้อมูลใด ๆ ตัวอย่างเช่น:

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

อ่านนี้สำหรับข้อมูลเพิ่มเติม


76
แต่ res.end สามารถทำหน้าที่เหมือน res.send โดยที่คุณสามารถส่งอาร์กิวเมนต์สตริงเพื่อเพิ่มเป็นเนื้อหาตอบกลับได้ ยิ่งไปกว่านั้น res.send ยังสิ้นสุดการตอบสนอง แล้วมันแตกต่างกันอย่างไร?
saltthehash

33
@ psytech140 Jmar77 มีคำตอบที่ดีที่นี่ : "ถ้าคุณส่งสตริงไปที่ res.send () จะถือว่า Content-Type เป็น html. res.end () โดยอัตโนมัติเพียงแค่เรียกการใช้งาน end () ที่เป็นพื้นฐานของโหนดบน กระแสตอบรับดังนั้นจึงไม่มีการตั้งสมมติฐานสำหรับประเภทเนื้อหา "
abagh0703

ต้องโหวตให้คะแนนนี้อย่างหมดจดเพราะฉันไม่เคยใช้expressแต่จากชื่อเรื่อง - มีคนส่งบางอย่างคนหนึ่งจบอะไรบางอย่าง .... 'ใช่แล้ว
Darren Bartrup-Cook

แต่ถ้าคุณใช้res.send()โดยไม่มีอะไรเลย การกระทำเช่นนี้res.end()หรือไม่?
CMCDragonkai


121

ฉันต้องการให้ความสำคัญอีกเล็กน้อยเกี่ยวกับความแตกต่างที่สำคัญบางประการระหว่างres.end()& res.send()เกี่ยวกับส่วนหัวการตอบกลับและเหตุใดจึงมีความสำคัญ

1. res.send () จะตรวจสอบโครงสร้างของผลลัพธ์ของคุณและตั้งค่าข้อมูลส่วนหัวตามนั้น


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

ป้อนคำอธิบายภาพที่นี่


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

ป้อนคำอธิบายภาพที่นี่

โดยที่ res.end () คุณสามารถตอบกลับด้วยข้อความเท่านั้นและจะไม่ตั้งค่า " Content-Type "

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

ป้อนคำอธิบายภาพที่นี่

2. res.send () จะตั้งค่าแอตทริบิวต์ "ETag" ในส่วนหัวการตอบกลับ

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

ป้อนคำอธิบายภาพที่นี่

¿แท็กนี้สำคัญไฉน?
ส่วนหัวการตอบกลับ ETag HTTP เป็นตัวระบุสำหรับเวอร์ชันเฉพาะของทรัพยากร ช่วยให้แคชมีประสิทธิภาพมากขึ้นและประหยัดแบนด์วิดท์เนื่องจากเว็บเซิร์ฟเวอร์ไม่จำเป็นต้องส่งการตอบสนองทั้งหมดหากเนื้อหาไม่มีการเปลี่ยนแปลง

res.end() จะไม่ตั้งค่าแอตทริบิวต์ส่วนหัวนี้


5
นี่จะเป็นคำตอบที่ยอมรับในความคิดของฉัน ... amphasis เพิ่มเติมเกิดขึ้นจากความแตกต่างที่เกิดขึ้นจริงซึ่งสามารถทำลายวันทำงานของคุณแทนที่จะอภิปรายเกี่ยวกับการยุติการตอบสนองโดยมี / ไม่มีเนื้อหา ...
Tomas

13

สิ่ง res.send () ไม่เป็นในการดำเนินการres.write , res.setHeadersและres.end
ตรวจสอบว่าคุณส่งข้อมูลอะไรและตั้งค่าส่วนหัวที่ถูกต้อง

จากนั้นสตรีมข้อมูลด้วย res.write และในที่สุดก็ใช้ res.end เพื่อกำหนดจุดสิ้นสุดของคำขอ

มีบางกรณีที่คุณต้องการทำด้วยตนเองเช่นหากคุณต้องการสตรีมไฟล์หรือชุดข้อมูลขนาดใหญ่ในกรณีนี้คุณจะต้องตั้งค่าส่วนหัวด้วยตัวคุณเองและใช้ res.write เพื่อให้สตรีม ไหล.


1

resเป็นอ็อบเจ็กต์ HttpResponse ซึ่งขยายจาก OutgoingMessage res.sendการโทรres.endที่ใช้งานโดย OutgoingMessage เพื่อส่งการตอบสนอง HTTP และปิดการเชื่อมต่อ เราเห็นรหัสที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.