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

sud*_*hcm 118 node.js express

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

它们是相同还是不同?

BIB*_*NJU 107

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

res.send([body])
Run Code Online (Sandbox Code Playgroud)

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' });
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅

res.end()将结束响应过程.这种方法实际上来自Node核心,特别是response.end()方法http.ServerResponse.它用于在没有任何数据的情况下快速结束响应.例如:

res.end();
res.status(404).end();
Run Code Online (Sandbox Code Playgroud)

阅读本文以获取更多信息.

  • 但res.end实际上可以像res.send一样,因为你可以传递一个字符串参数作为响应体添加.最重要的是,res.send也结束了响应.那么它们在功能上有何不同? (61认同)
  • @ psytech140 Jmar77有一个很好的回复[这里](http://stackoverflow.com/a/22774872/5177017):"如果你将一个字符串传递给res.send(),它会自动假定一个内容类型为html.然而,.end()只是在响应流上调用节点的底层end()实现,因此不对Content-Type进行任何假设. (27认同)
  • 但是如果你什么都不使用 `res.send()` 会怎样呢?这是否像“res.end()”一样? (3认同)
  • 不得不赞成这一点纯粹是因为我从未使用过“快递”,但从标题来看 - 一个发送一些东西,一个结束一些东西......'是对的。 (2认同)
  • 请参阅[下面的答案](/sf/answers/3446959001/)和[幕后发生的事情](/sf/answers/3841195921/)的区别 (2认同)

小智 74

我想作一点点强调之间的一些关键区别res.end()res.send()相对于响应头以及为什么它们是重要的.

1. res.send()将检查输出结构并相应地设置标题信息.


    app.get('/',(req,res)=>{
       res.send('<b>hello</b>');
    });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


     app.get('/',(req,res)=>{
         res.send({msg:'hello'});
     });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

res.end()的位置只能用文本回复,不会设置" Content-Type "

      app.get('/',(req,res)=>{
           res.end('<b>hello</b>');
      }); 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

2. res.send()将在响应头中设置"ETag"属性

      app.get('/',(req,res)=>{
            res.send('<b>hello</b>');
      });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

¿为什么这个标签很重要?
ETag HTTP响应头是特定版本资源的标识符.它允许缓存更高效,并节省带宽,因为如果内容未更改,Web服务器不需要发送完整响应.

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

  • 在我看来,这应该是可接受的答案...更多地强调可能会毁掉您工作日的实际差异,而不是讨论结束有/没有内容的响应... (13认同)
  • 那么基本上将 `.end()` 视为低级函数并在 Express 应用程序中使用 `.send()` 吗? (5认同)

Aal*_*der 11

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

答案很简单。

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

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

app.get('/start-service', (req, res) => {
   // Some logic here
   exec('./application'); // dummy code
   res.end();
});
Run Code Online (Sandbox Code Playgroud)

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

app.get('/start-service', (req, res) => {
   res.send('{"age":22}');
});
Run Code Online (Sandbox Code Playgroud)

在这里您可以阅读更多内容:


Nik*_*ini 7

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

res.send()自动调用res.end()所以您不必在之后调用或提及它res.send()


Ami*_*ner 5

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

然后,它使用res.write传输数据,最后使用res.end设置请求的结尾。

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


Pyl*_*lon 5

res是一个继承自 OutgoingMessage 的 HttpResponse 对象。res.send调用res.end由 OutgoingMessage 实现的发送 HTTP 响应并关闭连接的方法。我们在这里看到代码