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

What is the difference between res.end() and res.send()?

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

它们相同还是不同?

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() 在响应 header 方面的一些关键差异及其重要性。

1. res.send() 将检查输出的结构并设置 header 相应的信息。


    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() 将在响应 header

中设置 "ETag" 属性
      app.get('/',(req,res)=>{
            res.send('<b>hello</b>');
      });

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

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

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

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

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

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

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

res.send()自动调用res.end()所以你不用在res.send()

之后调用或提及

除了优秀的答案,我想在这里强调什么时候使用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}');
});

在这里你可以阅读更多内容

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

的组合