response.setHeader和response.writeHead的区别是什么?

50
在我的应用程序中,我让Nodejs服务器发送JSON响应。我发现有两种方法可以实现,但我不确定它们之间的区别是什么。

其中一种方式是

var json = JSON.stringify(result.rows);
response.writeHead(200, {'content-type':'application/json', 'content-length':Buffer.byteLength(json)}); 
response.end(json);

而我另外一种方式是

var json = JSON.stringify(result.rows);
response.setHeader('Content-Type', 'application/json');
response.end(json);

这两种方法都可以,我只是想知道它们之间的区别以及在什么情况下应该使用其中一种。


文档?http://nodejs.org/api/http.html#http_response_writehead_statuscode_reasonphrase_headers - Yury Tarabanko
2
当然,我已经阅读了文档。但是我的响应头知识有限,主要想知道何时应该使用其中一种方式。 - cYn
6
当您想设置单个头文件而不设置状态码时,请使用 setHeader;当您想要设置状态码和一堆头文件(可选)时,请使用 writeHead。 (c) Captain Obvious - Yury Tarabanko
11
S.O.上的人对他们的“踩”太残酷了。我认为这个问题没有任何问题。 - Anthony
1个回答

78
response.setHeader() 只能设置一个单一的头信息。 response.writeHead() 可以设置响应头的几乎所有内容,包括状态码、内容和多个头信息。
请参考 NodeJS 文档: response.setHeader(name, value)

为隐式头信息设置单一的头值。如果此头已经存在于将要发送的头信息中,则它的值将被替换。使用字符串数组在此处发送具有相同名称的多个头信息。

var body = "hello world";
response.setHeader("Content-Length", body.length);
response.setHeader("Content-Type", "text/plain");
response.setHeader("Set-Cookie", "type=ninja");
response.status(200);

response.writeHead(statusCode[, statusMessage][, headers]))

该方法向请求发送响应头。状态码是一个三位的HTTP状态码,例如404。最后一个参数headers是响应头。可选的第二个参数statusMessage为人类可读的状态信息。

var body = "hello world";
response.writeHead(200, {
    "Content-Length": body.length,
    "Content-Type": "text/plain",
    "Set-Cookie": "type=ninja"
});

5
这个答案引导我对它有了一点更深入的理解。谢谢你。正如你所看到的,这两种方法在代码上几乎相同,因此导致了我的困惑。所以我不理解为什么要使用setHeader而不是writeHead,如果在基本层面上,它们都是在做同样的事情。 - cYn
res.statusCode = 200; 不是 response.status(200); 在 Node.js v5 中测试过。 - Bhaveshkumar
1
@Bhaveshkumar,我在文档中看到res.status()是有效的。 - zero298
2
使用writeHead一旦设置了标头就无法再次更改,这也将覆盖setHeader设置的标头。https://nodejs.org/dist/latest-v13.x/docs/api/http.html#http_response_writehead_statuscode_statusmessage_headers - some_groceries
6
你没有提及的另一点是,在调用 response.writeHead() 后,头信息就已经被发送了,你不能再设置任何头信息了。而 response.setHeader() 只是配置了将来要发送的头信息,直到它们被实际发送前,你始终可以设置或修改头信息。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接