nodejs中response.send和response.write的区别

IT技术 javascript node.js restify
2021-03-04 17:11:11

我编写了一个使用 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.jsresponse.write之间的区别response.send因为response.write我可以设置标题并写入其中,但是当我使用response.send. 当我使用response.sendwithsetHeader()或出现writeHeader()此错误时:

http.js:691
    throw new Error('不能在发送后设置标题。');
          ^
    错误:发送后无法设置标头。

还有另一件事。随着response.send()我在屏幕上获得完整的 HTML 输出,如:

<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"

但是response.write我没有在屏幕上看到 html 而只有 text "bla bla bla"

如果有人可以向我解释这些差异,那就太好了。

4个回答

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

也就是说,send只能调用一次,write可以调用多次,但必须调用end自己。

您想在浏览器中显示 html 代码吗?如果是这样,只需添加头部内容类型,例如response.writeHead('content-type','text/plain')
2021-05-02 17:11:11
但是我用这两个函数收到的输出类型呢?就像我说的, res.write 不会在屏幕或浏览器上打印整个 html,但 res.send 会。
2021-05-03 17:11:11
基本上response.send(msg)是一样的response.end(msg)你只需要输入一个额外的 s。
2021-05-06 17:11:11
@theonlygusti 这不完全正确。考虑response.write("Hello");response.end(" World")vs response.write("Hello");response.send(" World")后者会给我一个错误,说“错误:发送后无法设置标题。” 不知道发生了什么。
2021-05-06 17:11:11
@Kun 看看 HTTP 请求的结构——当您开始发送请求正文(“Hello”)时,您必须已经发送了标头。send尝试根据传递给它的对象的类型来猜测和设置标头,因此如果标头已被锁定,则它会失败。
2021-05-18 17:11:11

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

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

编辑

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

res.send() 是一个不推荐使用的方法。stackoverflow.com/questions/30550049/...
2021-04-21 17:11:11
@ user3275​​959,您能否再解释一下输出的差异?
2021-05-10 17:11:11
但是我用这两个函数收到的输出类型呢?就像我说的, res.write 不会在屏幕或浏览器上打印整个 html,但 res.send 会。
2021-05-14 17:11:11

res.send()Express.js而不是纯Node.js 的一部分

只是一个侧面观察。我的应用程序有时会发回一个非常大的Json对象(包含超过 100k 点的HighChart对象)。随着res.send()有时挂起,呛了服务器,而res.write()res.end()处理它就好了。

我还注意到res.send()调用时内存峰值

在我的最后工作相反, res.send(json) 帮助我非常好地返回一个大的 json 而 res.write(json) 和 res.end() 不能完成这项工作
2021-04-27 17:11:11
Woops 忽略在 Express 中不工作的全部内容:github.com/expressjs/compression/issues/39
2021-05-08 17:11:11
这是关键!res.send 只在 Express note 节点。它还执行一系列魔术,例如设置内容长度和内容类型。如果你想拥有绝对的控制权,你需要 res.write 和 res.end。事实上,此时的 express 压缩module仅使用 res.write & res.end 运行。
2021-05-16 17:11:11

我试图使用 res.send(data) 和 res.write(data) 通过 http 发送大量文本数据(295mb)。我注意到 res.send(data) 比 res.write(data) 慢。我观察了以下事情。

res.send(data):它只能被调用一次,它以某个缓冲区大小的块向客户端发送数据,然后再次返回并发送另一个缓冲区大小的块,因此有很多来回的http通信。

res.write(data):它可以被多次调用,然后是 res.end() 并且它基于整个数据创建缓冲区大小并通过 http 发送,因此在大量数据的情况下它会更快。