res.end() 和 res.send() 有啥区别?

Posted

技术标签:

【中文标题】res.end() 和 res.send() 有啥区别?【英文标题】:What is the difference between res.end() and res.send()?res.end() 和 res.send() 有什么区别? 【发布时间】:2015-06-15 19:26:27 【问题描述】:

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

它们是相同的还是不同的?

【问题讨论】:

我认为res.end 被普通节点使用,而res.send 被快速框架使用 response.send 包括一个response.end 调用。 【参考方案1】:

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

请参阅this 了解更多信息。

res.end() 将结束响应过程。这个方法其实来自Node核心,具体是http.ServerResponseresponse.end()方法。它用于在没有任何数据的情况下快速结束响应。例如:

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

阅读this了解更多信息。

【讨论】:

但是 res.end 实际上可以像 res.send 一样工作,因为您可以传递一个字符串参数以添加为响应正文。最重要的是, res.send 也结束了响应。那么它们在功能上有何不同? @psytech140 Jmar77 有一个很好的回应here:“如果你将一个字符串传递给 res.send(),它会自动假定 Content-Type 为 html.res.end(),但是,只需在响应流上调用节点的底层 end() 实现,因此不对 Content-Type 做任何假设。” 不得不赞成这个纯粹是因为我从未使用过express,但从标题来看 - 一个发送一些东西,一个结束一些东西......'这是正确的。 但是如果你只使用res.send() 什么都不用呢。这是否像res.end() 查看below answer 和what happened under the hood 的区别【参考方案2】:

我想更加强调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() 不会设置此标头属性

【讨论】:

在我看来,这应该是可以接受的答案...更多的重点是可能会破坏您的工作日的实际差异,而不是讨论结束有/无内容的响应...... 所以基本上将.end()视为一个低级函数并在您的Express应用程序中使用.send() 保持简单和愚蠢:) +1【参考方案3】:

res.send() 实现 res.writeres.setHeadersres.end

    它会检查您发送的数据并设置正确的响应标头。 然后它使用res.write 流式传输数据。 最后,它使用res.end 来设置请求的结束。

在某些情况下,您需要手动执行此操作,例如,如果您想要流式传输文件或大型数据集。在这些情况下,您需要自己设置标头并使用res.write 来保持流的流动。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

res.send 用于向客户端发送响应,res.end 用于结束您正在发送的响应。

res.send自动调用res.end所以res.send之后不用再调用或提及

【讨论】:

【参考方案6】:

除了出色的答案之外,我想在这里强调一下何时使用 res.end() 以及何时使用 res.send() 这就是原因我最初登陆这里并没有找到解决方案。

答案很简单

res.end() 用于快速结束响应而不发送任何数据。

一个例子是在服务器上启动一个进程

app.get(/start-service, (req, res) => 
   // Some logic here
   exec('./application'); // dummy code
   res.end();
);

如果您想在响应中发送数据,那么您应该使用 res.send() 代替

app.get(/start-service, (req, res) => 
   res.send('"age":22');
);

在这里你可以阅读更多

http://expressjs.com/en/4x/api.html#res.end http://expressjs.com/en/4x/api.html#res.send

【讨论】:

【参考方案7】:

res.end() 函数用于结束响应过程。 res.send()函数是res.write()res.setHeaders()res.end()的组合。

【讨论】:

以上是关于res.end() 和 res.send() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

在 express 中 res.send 和 res.write 有啥区别?

app.get - res.send 与 return res.send 之间有啥区别吗

Node ejs

express respond.send 和 end的区别

Nodejs 和 Express,使用来自工作线程的 res.send()

res.send()传参----Invalid status code: 1