res.end()和res.send()有什么区别?


141

我是的初学者,Express.js对以下两个关键字感到困惑:res.end()res.send()

它们是相同还是不同?


1
我认为是res.end由普通节点使用的,就像res.send由快速框架使用的那样
穆罕默德·乌默尔·伊德里西

Answers:


130

res.send()将发送HTTP响应。它的语法是

res.send([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核心,特别是的response.end()方法http.ServerResponse。它用于快速结束没有任何数据的响应。例如:

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

阅读以获得更多信息。


68
但是res.end实际上可以像res.send一样工作,因为您可以传递一个字符串参数以添加为响应主体。最重要的是,res.send也会结束响应。那么它们在功能上有何不同?
saltthehash

31
@ psytech140 Jmar77在这里有一个很好的响应:“如果将字符串传递给res.send(),它将自动采用html.res.end()的Content-Type,但是,只需在节点上调用节点的基础end()实现响应流,因此不对Content-Type做任何假设。”
abagh0703

纯粹是因为我从未使用过,express而是出于标题的考虑而投票支持-一个发送东西,一个结束东西...。
达伦·巴特鲁普·库克

但是,如果您什么都不用怎么办res.send()。这像res.end()吗?
CMCDragonkai


108

我想更加强调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响应标头是资源特定版本的标识符。它可以使缓存更高效,并节省带宽,因为如果内容未更改,Web服务器不需要发送完整的响应。

res.end() 不会设置此标头属性


4
在我看来,这应该是可以接受的答案。。。更多的重点放在会破坏您的工作日的实际差异上,而不是讨论结束具有或不具有内容的响应...
Tomas

13

res.send()的作用是实现res.writeres.setHeadersres.end
它会检查您发送的数据并设置正确的标头,

然后使用res.write将数据流化,最后使用res.end设置请求的结尾。

在某些情况下,您可能希望手动执行此操作,例如,如果您想流文件或大型数据集,在这种情况下,您将需要自己设置标题并使用res.write来保持流流。


0

res是从OutgoingMessage扩展的HttpResponse对象。由OutgoingMessage实现的res.send调用res.end以发送HTTP响应并关闭连接。我们在这里看到代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.