Express.js - 如何检查标头是否已发送?

pow*_*boy 65 javascript node.js response-headers express

我正在写一个可以设置标题的库.如果标头已经发送,我想给出一个自定义错误消息,而不是让它失败,Node.js给出的"无法在发送标题后设置标题".那么如何检查标头是否已经发送?

Wil*_*der 147

Node支持res.headersSent这些天,所以你可以/应该使用它.它是一个只读布尔值,表示标头是否已被发送.

if(res.headersSent) { ... }
Run Code Online (Sandbox Code Playgroud)

请参阅http://nodejs.org/api/http.html#http_response_headerssent

注意:与Niko提到的旧版Connect'leaderSent'属性相比,这是首选方法.

  • 这应该是接受的答案,因为当前接受的答案不再有效. (5认同)

Nik*_*iko 45

编辑:从快递4.x开始,您需要使用res.headersSent.另请注意,您可能希望在检查之前使用setTimeout,因为在调用res.send()之后它不会立即设置为true.资源

简单:Connect的Response类提供了一个公共属性"headerSent".

res.headerSent 是一个布尔值,指示标头是否已发送到客户端.

从源代码:

/**
   * Provide a public "header sent" flag
   * until node does.
   *
   * @return {Boolean}
   * @api public
   */

  res.__defineGetter__('headerSent', function(){
    return this._header;
  });
Run Code Online (Sandbox Code Playgroud)

https://github.com/senchalabs/connect/blob/master/lib/patch.js#L22

  • 截至2014年5月17日,res.headerSent已被senchalabs/connect弃用,转而使用res.headersSent. (9认同)
  • @powerboy Node目前支持res.headersSent本地,因此开始使用该属性可能是个好主意. (6认同)
  • 它是“ headersSent”而不是“ headerSent” (5认同)
  • 不再工作了.请参阅@ WillemMulder的回答. (4认同)

Man*_*ddy 5

其他答案指向Node.js或Github网站。

以下来自Expressjs网站:https ://expressjs.com/en/api.html#res.headers已发送

app.get('/', function (req, res) {
  console.log(res.headersSent); // false
  res.send('OK');
  console.log(res.headersSent); // true
});
Run Code Online (Sandbox Code Playgroud)