response.setHeader和response.writeHead之间的区别?

cYn*_*cYn 27 javascript node.js

在我的应用程序中,我让我的Nodejs服务器发送JSON响应.我发现了两种方法,但我不确定它们之间的区别.

一种方法是

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

我的另一种方式是

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

两种方式都有效,我只是想知道两者之间的区别是什么,以及何时应该使用另一种方式.

zer*_*298 44

response.setHeader()只允许您设置单个标题.

response.writeHead()将允许您设置有关响应头的所有内容,包括状态代码,内容和多个标头.

考虑API:

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);
Run Code Online (Sandbox Code Playgroud)

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

向请求发送响应标头.状态代码是一个3位HTTP状态代码,如404.最后一个参数headers是响应头.可选地,可以将人类可读的reasonPhrase作为第二个参数.

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

  • 您在这里没有提到的另一件事是,一旦您调用“response.writeHead()”,标头就会被发送,并且您不能再设置任何标头。而 `response.setHeader()` 只是配置将来发送时将发送哪些标头,您可以继续设置或修改标头,直到实际发送为止。 (6认同)
  • 这个答案引导我进入理解它的方向.这次真是万分感谢.正如您所看到的,这两种方法在代码中看起来几乎相同,因此引起了我的困惑.所以我只是不明白为什么我会使用setHeader而不是writeHead,如果在基本级别,他们都做同样的事情. (3认同)
  • `response.writeHead(200, { "Content-Type": "text/html"});` 一旦使用 writeHead 设置标头,就无法再次更改,这也将覆盖 setHeader 设置的标头 https://nodejs.org/ dist/latest-v13.x/docs/api/http.html#http_response_writehead_statuscode_statusmessage_headers (2认同)