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

98

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

我正在编写一份库,其中可能会设置头文件。如果已经发送了头文件,我想要提供自定义的错误消息,而不是让其失败并显示 Node.js 给出的“Can't set headers after they are sent”消息。那么,如何检查是否已经发送了头文件?

2
powerboy,你能否接受另一个答案呢?因为当前被接受的答案已经不再适用了。请查看@fiatjaf的评论。 - Willem Mulder
3个回答

221

现在Node支持res.headersSent,因此您可以/应该使用它。 它是一个只读布尔值,指示标头是否已发送。

if(res.headersSent) { ... }

请查看http://nodejs.org/api/http.html#http_response_headerssent

注意:与Niko提到的旧的Connect 'headerSent'属性相比,这是更优选的方法。


7
既然当前被接受的答案已不再实用,那么这个应该被设为被接受的答案。 - mantagen

75

编辑提示:从express 4.x开始,您需要使用res.headersSent属性。请注意,在调用res.send()后立即跟踪该属性并不会立即将其设置为true,因此您可能需要在检查之前使用setTimeout。来源

简单来说: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
请注意,这与http://nodejs.org/docs/latest/api/http.html#http_response_headerssent不同。在Express中,它似乎返回已发送的头部信息,而不是一个布尔值来表示头部是否已发送。 - Lee Olayvar
每天我都很欣赏nodejs的简单概念。 - Bruno
6
目前Node已经原生支持res.headersSent属性,因此开始使用该属性可能是个不错的想法。 - Willem Mulder
11
自2014年5月17日起,senchalabs/connect已弃用res.headerSent,改用res.headersSent。 - Kunal Kapadia
11
“headersSent”不是“headerSent”。 - Onur Yıldırım
显示剩余5条评论

16

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

以下内容来自Expressjs网站:https://expressjs.com/en/api.html#res.headersSent

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

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