Express.js - Wie kann ich überprüfen, ob bereits Header gesendet wurden?

74

Ich schreibe eine Bibliothek, die Header setzen kann. Ich möchte eine benutzerdefinierte Fehlermeldung ausgeben, wenn bereits Header gesendet wurden, anstatt sie nur mit der Meldung "Header können nach dem Senden nicht festgelegt werden" von Node.js fehlschlagen zu lassen. Wie kann man also überprüfen, ob bereits Header gesendet wurden?

Powerboy
quelle
2
Powerboy, könnten Sie die andere Antwort akzeptieren, weil die aktuell akzeptierte Antwort nicht mehr funktioniert? Siehe @ fiatjafs Kommentar.
Willem Mulder

Antworten:

56

BEARBEITEN: Ab Express 4.x müssen Sie res.headersSent verwenden. Beachten Sie auch, dass Sie setTimeout möglicherweise vor dem Überprüfen verwenden möchten, da es nicht unmittelbar nach einem Aufruf von res.send () auf true gesetzt wird. Quelle

Einfach: Die Antwortklasse von Connect bietet eine öffentliche Eigenschaft "headerSent".

res.headerSent ist ein boolescher Wert, der angibt, ob die Header bereits an den Client gesendet wurden.

Aus dem Quellcode:

/**
   * 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

Niko
quelle
1
Beachten Sie, dass dies nicht mit nodejs.org/docs/latest/api/http.html#http_response_headerssent identisch ist. In Express scheint es, dass die gesendeten Header zurückgegeben werden.
Lee Olayvar
Jeden Tag bewundere ich, wie einfach das Konzept von nodej ist.
BG BRUNO
6
@powerboy Node unterstützt derzeit res.headersSent nativ, daher ist es wahrscheinlich eine gute Idee, diese Eigenschaft zu verwenden.
Willem Mulder
11
Ab dem 17. Mai 2014 wurde res.headerSent von senchalabs / connect zugunsten von res.headersSent abgelehnt.
Kunal Kapadia
7
es ist headersSentnichtheaderSent
Onur Yıldırım
174

Node unterstützt res.headersSentdiese Tage, also könnten / sollten Sie das nutzen. Es ist ein schreibgeschützter Boolescher Wert, der angibt, ob die Header bereits gesendet wurden.

if(res.headersSent) { ... }

Siehe http://nodejs.org/api/http.html#http_response_headerssent

Hinweis: Dies ist die bevorzugte Methode im Vergleich zu der älteren Connect-Eigenschaft "headerSent", die Niko erwähnt.

Willem Mulder
quelle
5
Dies sollte zur akzeptierten Antwort gemacht werden, da die aktuell akzeptierte Antwort nicht mehr funktioniert.
Mantagen
8

Andere Antworten verweisen auf Node.js- oder Github-Websites.

Unten finden Sie Informationen von der Expressjs-Website: 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
});
Manohar Reddy Poreddy
quelle