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

7
以下有什么区别?
response.status(200).send('Hello World!');

并且这个

response.writeHead(200, {'content-type':'application/json'}); 
response.end('Hello World!');

这些应该在哪种情况下使用?


1
为什么您将内容类型设置为application/json,然后发送纯文本? - jfriend00
3个回答

7
response.status(...)会指定将来要使用的状态码。头信息不会在响应体发送之前发送。 response.writeHead(...)实际上是将响应头信息排队,以便立即发送出去。这意味着您不能再为该响应分配任何标头或状态代码,因为所有这些都已经被发送出去了。
通常情况下,您会使用前一种模式,但如果您想更快地获得首字节时间(TTFB),则 .writeHead很有用。

5
从 `statusCode` 的角度来看,以下操作都是相同的:
  1. 调用 res.status(statusCode)
  2. 直接设置 res.statusCode 属性
  3. res.writeHead(statusCode, ...) 传递 statusCode
  4. 调用 res.sendStatus(statusCode)
对于 `statusCode` 本身,它们都执行相同的操作,即设置 `.statusCode` 属性。该属性值随后会在响应发送标头时使用(根据所选选项可能立即发送或稍后发送)。您可以查看 Express 和 http 源代码(下面提供参考)以了解这一点。
调用 `res.status()` 和设置 `res.statusCode` 只是为日后使用而设置属性。
调用 `res.writeHead()` 设置了 `res.statusCode` 属性,然后将立即刷新标头,而不是将其排队等待稍后发送的常规行为。但从 `statusCode` 的角度来看,没有区别。
调用 `res.sendStatus()` 设置了 `res.statusCode` 属性,然后会立即发送响应,只包含标头,没有正文。这通常用于不需要正文的响应(重定向、错误代码等等)。
对于此类问题,您可以查看源代码。对于 `.status()`,我们看到了 这个
res.status = function status(code) {
  this.statusCode = code;
  return this;
};

然后,在nodejs中的http.ServerResponse代码中,你可以看到自己调用.writeHead()实际上只是在调用.end()刷新头和响应的其余部分之前设置了相同的this.statusCode属性:
而且,如果你查看http.ServerResponse的文档,你会看到这个内容:
response.statusCode 添加于: v0.4.0 默认值: 200 当使用隐式头(不显式地调用 response.writeHead())时,此属性控制在头被刷新时将发送到客户端的状态码。
所以,.status()只是一个设置statusCode属性的方法,当头最终被发送(在未来)并且(从statusCode的角度来看)与调用writeHead()并传递状态码完全相同时,响应值将被发送。
Express试图在更高的抽象级别上进行操作,因此创建了一个可在设置响应之前任何时间调用的方法来单独设置statusCode

1
除了Jacob的回答之外,response.status不是NodeJS标准库的一部分(请参见文档),而实际上是第三方的。

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