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.ServerResponse
的response.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.write
、res.setHeaders
和 res.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 之间有啥区别吗