【发布时间】:2017-11-25 07:10:53
【问题描述】:
我是express.js 的初学者,我想了解res.send 和res.write 之间的区别?
【问题讨论】:
我是express.js 的初学者,我想了解res.send 和res.write 之间的区别?
【问题讨论】:
res.send
res.send 仅在 Express.js 中。Content-Length HTTP 响应头字段。res.send 只能调用一次,因为它相当于res.write + res.end()
app.get('/user/:id', function (req, res) {
res.send('OK');
});
更多详情:
res.write
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
更多详情:
【讨论】:
res.write 一点点,这是OutgoingMessage 类从节点http 模块提供的方法。 Express.js response 类继承 OutgoingMessage 类。下面是write方法的定义:OutgoingMessage.prototype.write = function write(chunk, encoding, callback) { return write_(this, chunk, encoding, callback, false); };
send 自动设置编码为 UTF-8
假设你有两行需要显示并且你使用 res.send as
res.send("shows only First Line")
res.send("won't show second Line")
然后只会显示第一行,而使用res.write 您可以灵活地编写多行,例如
res.write("Shows first line")
res.write("Shows second line")
res.send()
【讨论】:
最重要的区别之一没有在任何答案中指出是“排水”。
res.write 可能返回 true 或 false。截至文档:
如果整个数据都成功刷新到内核,则返回 true 缓冲。如果全部或部分数据在用户中排队,则返回 false 记忆。 'drain' 将在缓冲区再次空闲时发出。
因此,在执行res.write 时,如果res.write 返回 false,则调用者应该推迟写入,直到发出 drain 事件。
所有这些都在res.send 中自动处理。权衡是使用后者时必须做的缓冲。
【讨论】:
res.send 等价于res.write + res.end
所以关键区别在于res.send 只能调用一次,而res.write 可以多次调用,然后是res.end。
但除此之外,res.send 是 Express 的一部分。它可以自动检测响应头的长度。
但是 res.send() 可能会导致内存峰值,如果文件很大,我们的应用程序会在两者之间挂起。
【讨论】: