我编写了一个使用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 throw new Error('Can\'t set headers after they are sent.'); ^ Error: Can't set headers after they are sent.
还有另外一件事。使用response.send()
,我在屏幕上获得完整的HTML输出,如:
<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"
但使用response.write
我不会在屏幕上显示html而只会显示文字"bla bla bla"
。
如果有人能解释我的差异,那将会很棒。
答案 0 :(得分:61)
response.send(msg)
等于response.write(msg);response.end();
这意味着send
只能调用一次,write
可以多次调用,但您必须自己调用end
。
答案 1 :(得分:35)
我在docs找不到response.send()
,但我认为.send()
会填写并发送回复,因此只能调用一次,而.write()
则会只需编写回复,但您必须使用response.end()
这意味着您可以使用.write()
编辑标题,因为尚未发送回复。
编辑:
response.send()
是restify Response API wrapper
答案 2 :(得分:29)
res.send()
是 Express.js 的一部分,而不是纯 Node.js 。
只是一个侧面观察。我的应用程序有时会发回一个非常大的 Json 对象( HighChart 对象,其中包含超过100k点)。 res.send()
有时它会挂起并阻塞服务器,而res.write()
和res.end()
处理它就好了。
我还注意到在调用res.send()
时出现内存峰值。
答案 3 :(得分:1)
我试图使用res.send(data)和res.write(data)通过http发送大量文本数据(295mb)。我注意到res.send(data)比res.write(data)慢。我观察了以下事情。
res.send(data):它只能调用一次,它会将一些缓冲区大小的数据发送到客户端,然后再次返回并发送另一块缓冲区大小,这样就有了很多来回的http通讯。
res.write(data):它可以被多次调用,然后是res.end(),它会根据整个数据创建缓冲区大小,并通过http发送,以便在案例中更快大量的数据。