节点js中的response.send和response.write之间的区别
我写了一个使用Node js“restify”框架的小API。 该API接收请求(实际上是“/”之后的任何内容),然后将该请求发送到另一个服务器。 从服务器获取响应并将响应传递回原始的请求源。 对于这个API我使用restify服务器和客户端。
以下是更好理解的API代码。
var apiServer = require('apiServer'); apiServer.start(); var restify = require('restify'); var assert = require('assert'); function onRequest(request, response, next) { var client = restify.createStringClient({ url: 'http://example.com' }); client.get('/' + request.params[0], function(err, req, res, data) { assert.ifError(err); response.setHeader('Content-Type', 'text/html'); response.writeHead(res.statusCode); response.write(data); response.end(); }); next(); } function start() { var server = restify.createServer(); server.get(/^\/(.*)/, onRequest); server.listen(8888); console.log("Server has started."); } exports.start = start;
现在我需要知道Node.js的response.write
和response.send
之间的区别。 因为使用response.write
我可以设置标题并在其中写入,但是当我使用response.send
时,不可能对标题做任何事情。 当我使用response.send
与setHeader()
或writeHeader()
我得到这个错误:
http.js:691 抛出新的错误('发送后不能设置标题')。 ^ 错误:发送后无法设置标题。
还有另一件事。 通过response.send()
我可以在屏幕上获得完整的HTML输出:
<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"
但与response.write
我没有得到在屏幕上的HTML,但只有文字"bla bla bla"
。
如果有人能解释我的差异,这将是非常好的。
我无法在文档中findresponse.send()
,但是我认为.send()
将填充并发送响应,因此只能调用一次,而.write()
只会写入响应,但必须使用response.end()
发送它
这意味着您可以使用.write()
编辑标题,因为响应尚未发送。
编辑 :
response.send()
是Restify Response API包装器的一部分
response.send(msg)
等于response.write(msg);response.end();
这意味着, send
只能被调用一次, write
可以多次调用,但是你必须调用自己的end
。
res.send()
是Express.js的一部分,而不是纯Node.js。
只是一个侧面的观察。 我的应用程序有时会发回一个非常大的Json对象(包含超过100k点的HighChart对象)。 使用res.send()
有时会挂起并扼杀服务器,而res.write()
和res.end()
处理它就好了。
当res.send()
被调用时,我也注意到了一个内存尖峰。
我试图通过使用res.send(data)和res.write(data)在http上发送大量的文本数据(295mb)。 我注意到res.send(data)比res.write(data)慢。 我观察到以下事情。
res.send(data):它只能被调用一次,它以一定的缓冲区大小向客户端发送数据,然后再次返回并发送另一个缓冲区大小的块,所以有很多来回的http通信。
res.write(data):可以多次调用res.end(),它根据整个数据创build缓冲区大小并通过http发送,所以在数据量巨大的情况下会更快。