Express.js — Как проверить, отправлены ли уже заголовки?

Я пишу библиотеку, которая может устанавливать заголовки. Я хочу дать пользовательское сообщение об ошибке, если заголовки уже были отправлены, вместо того, чтобы просто позволить ему выйти из строя с сообщением «Невозможно установить заголовки после того, как они отправлены», заданным Node.js. Итак, как проверить, были ли уже отправлены заголовки?


person powerboy    schedule 19.08.2012    source источник
comment
powerboy, сможете ли вы принять другой ответ, потому что принятый в настоящее время ответ больше не работает? См. комментарий @fiatjaf.   -  person Willem Mulder    schedule 31.10.2015


Ответы (3)


РЕДАКТИРОВАТЬ: начиная с Express 4.x, вам необходимо использовать res.headersSent. Также обратите внимание, что вы можете использовать setTimeout перед проверкой, так как он не устанавливается в значение true сразу после вызова res.send(). Источник

Просто: класс Response Connect предоставляет общедоступное свойство «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

person Niko    schedule 19.08.2012
comment
Обратите внимание, что это не то же самое, что http://nodejs.org/docs/latest/api/http.html#http_response_headerssent В экспрессе кажется, что возвращаются отправленные заголовки.. а не логическое значение, если заголовки были отправлены. - person Lee Olayvar; 20.04.2013
comment
Каждый день я восхищаюсь простой концепцией nodejs. - person BG BRUNO; 29.11.2013
comment
@powerboy Node в настоящее время изначально поддерживает res.headersSent, поэтому, вероятно, стоит начать использовать это свойство. - person Willem Mulder; 06.06.2014
comment
По состоянию на 17 мая 2014 г. res.headerSent устарел senchalabs/connect в пользу res.headersSent. - person Kunal Kapadia; 28.11.2014
comment
это headersSentне headerSent - person Onur Yıldırım; 17.06.2017
comment
Я отредактировал ответ, чтобы отразить вещь headersSent, поскольку он принят, но теперь вводит в заблуждение. - person MalcolmOcean; 17.04.2018
comment
@MalcolmOcean setTimeout сколько? - person Emilio; 06.05.2018
comment
Кажется, просто использовать ноль не получится... У меня установлено значение 250 мс, чтобы быть в безопасности, но меньше, вероятно, было бы хорошо. - person MalcolmOcean; 08.05.2018
comment
я пометил этот ответ для модерации. res.headersSent ответ должен быть принятым решением, так как этот больше не работает. - person Mark Shust at M.academy; 12.06.2019

В наши дни Node поддерживает res.headersSent, так что вы можете/должны его использовать. Это логическое значение только для чтения, указывающее, были ли уже отправлены заголовки.

if(res.headersSent) { ... }

См. http://nodejs.org/api/http.html#http_response_headerssent.

Примечание: это предпочтительный способ сделать это по сравнению со старым свойством Connect 'headerSent', которое упоминает Нико.

person Willem Mulder    schedule 06.06.2014
comment
Это следует сделать принятым ответом, поскольку текущий принятый ответ больше не работает. - person mantagen; 27.06.2017

Другие ответы указывают на сайты 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
});
person Manohar Reddy Poreddy    schedule 13.08.2018