Sự khác biệt giữa res.end () và res.send () là gì?


141

Tôi là người mới bắt đầu Express.jsvà tôi bối rối bởi hai từ khóa này: res.end()res.send().

Chúng giống nhau hay khác nhau?


1
Tôi nghĩ res.endđược sử dụng bởi nút đơn giản, nơi res.sendđược sử dụng bởi framwork express
Muhammad Umer Idreesi

Câu trả lời:


129

res.send()sẽ gửi phản hồi HTTP. Cú pháp của nó là,

res.send([body])

Tham số thân có thể là đối tượng Bộ đệm, Chuỗi, đối tượng hoặc Mảng. Ví dụ:

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

Xem điều này để biết thêm.

res.end()sẽ kết thúc quá trình đáp ứng. Phương thức này thực sự đến từ lõi Node, cụ thể là response.end()phương pháp của http.ServerResponse. Nó được sử dụng để nhanh chóng kết thúc phản hồi mà không có bất kỳ dữ liệu nào. Ví dụ:

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

Đọc này để biết thêm.


68
Nhưng res.end thực sự có thể hoạt động như res.send, theo đó bạn có thể truyền một đối số chuỗi để thêm làm phần thân phản hồi. Trên hết, res.send cũng kết thúc phản hồi. Vậy chúng có chức năng khác nhau như thế nào?
saltthehash

31
@ psytech140 Jmar77 đã có một phản hồi tốt ở đây : "Nếu bạn chuyển một chuỗi sang res.send (), nó sẽ tự động giả định Loại nội dung của html. res.end (), tuy nhiên, chỉ cần gọi triển khai kết thúc bên dưới của nút trên) luồng phản hồi, do đó, không có giả định nào được đưa ra cho Kiểu nội dung. "
abagh0703

Phải nâng cao điều này hoàn toàn vì tôi chưa bao giờ sử dụng expressnhưng từ tiêu đề đã nghĩ - một người gửi một cái gì đó, một người kết thúc một cái gì đó ....
Darren Bartrup-Cook

Nhưng nếu bạn chỉ sử dụng res.send()mà không có gì. Điều này có hành động như thế res.end()nào?
CMCDragonkai


108

Tôi muốn nhấn mạnh hơn một chút về một số khác biệt chính giữa res.end()& res.send()liên quan đến tiêu đề phản hồi và lý do tại sao chúng quan trọng.

1. res.send () sẽ kiểm tra cấu trúc đầu ra của bạn và đặt thông tin tiêu đề tương ứng.


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

nhập mô tả hình ảnh ở đây


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

nhập mô tả hình ảnh ở đây

Trường hợp với res.end () bạn chỉ có thể trả lời bằng văn bản và nó sẽ không đặt " Kiểu nội dung "

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

nhập mô tả hình ảnh ở đây

2. res.send () sẽ đặt thuộc tính "ETag" trong tiêu đề phản hồi

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

nhập mô tả hình ảnh ở đây

Tại sao thẻ này quan trọng?
Tiêu đề phản hồi HTTP ETag là một định danh cho một phiên bản cụ thể của tài nguyên. Nó cho phép cache được hiệu quả hơn và tiết kiệm băng thông, vì máy chủ web không cần gửi phản hồi đầy đủ nếu nội dung không thay đổi.

res.end() sẽ KHÔNG đặt thuộc tính tiêu đề này


4
Theo ý kiến ​​của tôi, câu trả lời này sẽ được chấp nhận ... nhiều sự thay đổi được thực hiện dựa trên sự khác biệt thực tế có thể làm hỏng ngày làm việc của bạn thay vì thảo luận về kết thúc trả lời có / không có nội dung ...
Tomas

13

những gì res.send () làm, là để thực hiện res.write , res.setHeadersres.end .
nó kiểm tra dữ liệu bạn gửi và đặt tiêu đề chính xác,

sau đó truyền dữ liệu với res.write và cuối cùng, nó sử dụng res.end để đặt kết thúc yêu cầu.

có một số trường hợp bạn sẽ muốn thực hiện thủ công, ví dụ nếu bạn muốn tập tin luồng hoặc tập dữ liệu lớn, trong trường hợp này bạn sẽ muốn tự đặt tiêu đề và sử dụng res.write để giữ luồng lưu lượng.


0

reslà một đối tượng HttpResponse mở rộng từ Out gửiMessage. res.sendcác cuộc gọi res.endđược Out gửiMessage thực hiện để gửi phản hồi HTTP và kết nối chặt chẽ. Chúng tôi thấy mã ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.