Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点js中response.send和response.write之间的差异_Javascript_Node.js_Restify - Fatal编程技术网

Javascript 节点js中response.send和response.write之间的差异

Javascript 节点js中response.send和response.write之间的差异,javascript,node.js,restify,Javascript,Node.js,Restify,我已经编写了一个使用NodeJS“restify”框架的小API。此API接收一个请求(实际上是“/”之后的任何内容),然后将该请求发送到另一台服务器。从服务器获取响应并将响应传递回原始请求源。对于这个API,我同时使用restify服务器和客户端 下面是更好理解的API代码 var apiServer = require('apiServer'); apiServer.start(); var restify = require('restify'); var assert = requir

我已经编写了一个使用NodeJS“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.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()
res的一部分。send()
Express.js的一部分,而不是纯Node.js

只是一个侧面的观察。我的应用程序有时会发回一个非常大的Json对象(HighChart对象,包含超过10万个点)。使用
res.send()
有时它会挂起并阻塞服务器,而
res.write()
res.end()
处理得很好


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

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

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


res.write(data):它可以被多次调用,后面跟着res.end(),它根据整个数据创建缓冲区大小,并通过http发送,这样在数据量巨大的情况下会更快。

但是我用这两个函数收到的输出类型呢?正如我所说,res.write不会在屏幕或浏览器上打印整个html,但res.send会。是否要在浏览器中显示html代码?如果是这样,只需添加标题内容类型,如
response.writeHead('content-type','text/plain')
基本上,
response.send(msg)
response.end(msg)
相同。你只需要再打一个s。@theonlygusti这不完全是真的。考虑<代码>响应。写(“你好”);response.end(“World”)
vs
response.write(“Hello”);响应。发送(“世界”)
。后者会给我一个错误,说“错误:发送后无法设置头。”不确定发生了什么。@Kun看看HTTP请求的结构——当您开始发送请求主体(“Hello”)时,您必须已经发送了头
send
尝试根据您传递的对象类型猜测和设置标题,因此如果标题已锁定,则会失败。但是,我使用这两个函数接收的out类型如何?正如我所说,res.write不会在屏幕或浏览器上打印整个html,但res.send会打印。@user3275959,您能否再解释一下输出中的差异?res.send()是一种不推荐使用的方法。看这是钥匙!res.send仅在Express Notes节点中。它还执行了一系列魔术,比如设置内容长度和内容类型。如果您想拥有绝对控制权,则需要res.write和res.end。事实上,此时的express compress模块仅使用res.write&res.end.Woops运行,而忽略了整个不在express中工作的情况:在我的另一端,res.send(json)帮助我返回一个大的json非常好,而res.end()的res.write(json)则无法完成这项工作
<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"