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

use*_*959 54 javascript node.js restify

我编写了一个使用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;
Run Code Online (Sandbox Code Playgroud)

现在我需要知道Node.js response.write和之间的区别response.send.因为response.write我可以设置标题并在其中写入,但在使用时不能对标题执行任何操作response.send.当我用response.sendsetHeader()还是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"
Run Code Online (Sandbox Code Playgroud)

但是response.write我没有屏幕上的html,只有文字"bla bla bla".

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

Fly*_*her 63

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

这意味着,send只能被召唤一次,write可以多次召唤,但你必须end自己打电话.

  • 基本上,`response.send(msg)`与`response.end(msg)`相同.你只需要输入一个额外的s. (7认同)
  • @Kun 看看 HTTP 请求的结构——当您开始发送请求正文(“Hello”)时,您 _have_ 已经发送了标头。`send` 尝试根据传递给它的对象的类型来猜测和设置标头,因此如果标头已经被锁定,它就会失败。 (2认同)

Jim*_*ies 36

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

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

编辑:

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


Gän*_*ian 29

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

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

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

  • 这是关键!res.send仅在Express note Node中.它还执行一些神奇的设置内容长度和内容类型.如果你想要绝对控制,你需要res.write和res.end.实际上,此时的express压缩模块仅使用res.write和res.end运行. (2认同)