繁体   English   中英

节点js中response.send和response.write之间的区别

[英]Difference between response.send and response.write in node js

我编写了一个使用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.writeresponse.send之间的区别。 因为有了response.write我可以设置头文件并在其中写入,但是当我使用response.send时,不可能对头文件做任何事情。 当我使用带有setHeader()writeHeader() response.send ,我收到此错误:

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"

如果有人能解释我的差异会很棒。

response.send(msg)等于response.write(msg);response.end();

这意味着, send只能被调用一次, write可以多次调用,但是你必须自己调用end

我在文档中找不到response.send() ,但我假设.send()将填写并发送响应,因此只能调用一次,而.write()只会写响应,但你必须使用response.end()发送它

这意味着您可以使用.write()编辑标题,因为尚未发送响应。

编辑

response.send()restify Response API包装器的一部分

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(),它会根据整个数据创建缓冲区大小,并通过http发送,以便在数据量很大的情况下更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM