【问题标题】: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 调用。

标签: node.js express


【解决方案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()
【解决方案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

  1. 它会检查您发送的数据并设置正确的响应标头。
  2. 然后它使用res.write 流式传输数据。
  3. 最后,它使用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}');
        });
        

        在这里你可以阅读更多

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-25
            • 2017-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-02
            相关资源
            最近更新 更多