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


75

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


2
powerboy您将能够接受其他答案,因为当前接受的答案不再起作用了吗?参见@fiatjaf的评论。
威廉·穆德

Answers:


60

编辑:从Express 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;
  });

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


1
请注意,这与nodejs.org/docs/latest/api/http.html#http_response_headerssent表示不同,这似乎是返回已发送的标头。
Lee Olayvar

每天我都很佩服nodejs简单的概念。
BG BRUNO

6
@powerboy Node当前支持本地的res.headersSent,因此开始使用该属性可能是一个好主意。
Willem Mulder

11
自2014年5月17日起,senchalabs / connect已弃用res.headerSent,转而使用res.headersSent。
Kunal Kapadia 2014年

7
headersSent不是headerSent
厄尼尔耶尔德勒姆


8

其他答案指向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
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.