Vous êtes ici : » Accueil» Webserver » Node.js : ERR_HTTP_HEADERS_SENT

Node.js : ERR_HTTP_HEADERS_SENT

(Dernière mise à jour le: 27 septembre 2021)

Introduction 

Si vous voyez l’ Node.js erreur HTTP , ERR_HTTP_HEADERS_SENT, il y a probablement un problème avec la réponse dans votre code. Votre serveur peut essayer plusieurs fois d’atteindre un client et échouer car il ne trouve pas l’en-tête.

La solution à ce problème a tendance à être assez simple. Tout au long de cet article, nous verrons où réside cette erreur dans la hiérarchie Node.js, de quoi il s’agit et comment la corriger.

Le récapitulatif technique HTTP de Node.js

Le ERR_HTTP_HEADERS_SENT est une erreur d’exécution qui se trouve avec la hiérarchie Node.js Error.code :

  • Erreur
    • Code d’erreur
      • ERR_HTTP_HEADERS_SENT

La bonne chose à propos des erreurs dans le “Error.code” est que leurs noms reflètent généralement le type d’erreur que vous recevez. Donc, dans ce cas, l’erreur aura quelque chose à voir avec les en-têtes HTTP.

Qu’est-ce que l’erreur ERR_HTTP_HEADERS_SENT ?

Selon la documentation Node.js , un ERR_HTTP_HEADERS_SENT est “une tentative d’ajouter plus d’en-têtes après que les en-têtes [ont] déjà été envoyés”.

Décomposons un peu cela.

Si vous recevez cette erreur, cela signifie qu’une partie de votre code tente d’envoyer un en-tête après que le corps a déjà été écrit dans la réponse HTTP. C’est comme lorsque vous envoyez une lettre formelle. La lettre ne peut être envoyée que si vous incluez une adresse. Sans adresse, votre lettre ne va nulle part, ce qui signifie que personne ne pourra en lire le contenu. Les en-têtes et le corps sur un HTTP responsive fonctionnent de la même manière. Lors de l’envoi d’en-têtes avec votre réponse HTTP, vous devez écrire les en-têtes avant d’envoyer le corps, sinon vous ne pourrez pas envoyer le contenu du corps.

Maintenant que vous en savez un peu plus sur cette erreur particulière, il est temps d’apprendre à la corriger.

Comment réparer un ERR_HTTP_HEADERS_SENT

En tant que développeurs, vous avez le choix quant à la façon dont vous souhaitez coder. Vous pouvez coder en utilisant uniquement Node.js, ou vous pouvez utiliser le framework Express.js. Étant donné que les deux sont des moyens valides de coder à l’aide de Node.js, nous allons passer en revue cette erreur pour Node.js et Express.js.

Exemple Node.js

Voici un exemple de ce à quoi votre code pourrait ressembler si vous n’utilisez que Node.js :

const http = require('http');
server = http.createServer(function (req, res) {
 res.write('Hello, World!');
 res.setHeader('X-Foo', 'bar');
 res.setHeader('Content-Type', 'text/plain');
 res.end();
}).listen(8080);
 

Et, dès que vous l’exécutez et émettez cette requête : curl -i localhost:8080, le serveur mourra avec cette sortie :

_http_outgoing.js:561
   throw new ERR_HTTP_HEADERS_SENT('set');
   ^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
   at ServerResponse.setHeader (_http_outgoing.js:561:11)
   at Server.<anonymous> (/Users/ssb/src/node-tmp/server.js:5:7)
   at Server.emit (events.js:376:20)
   at parserOnIncoming (_http_server.js:896:12)
   at HTTPParser.parserOnHeadersComplete (_http_common.js:126:17) {
 code: 'ERR_HTTP_HEADERS_SENT'
}

Aïe ! Alors, qu’avons-nous fait de mal ici ?

Comme nous l’avons vu précédemment, une réponse HTTP à un client doit avoir ses en-têtes écrits avant le corps de la réponse.

 res.write('Hello, World!');
 res.setHeader('X-Foo', 'bar');
 res.setHeader('Content-Type', 'text/plain');

Le res.setHeader est appelé après le res.write, conduisant inévitablement à une erreur ERR_HTTP_HEADERS_SENT.

Voici à quoi devrait ressembler le code

 res.setHeader('X-Foo', 'bar');
 res.setHeader('Content-Type', 'text/plain');
 res.write('Hello, World!');

Si vous recevez cette erreur, prenez un moment et vérifiez votre code. Recherchez les instances où le corps procède à l’en-tête.

Exemple Express.js

En tant que développeur travaillant avec du code Node.js, vous utilisez peut-être le framework Express.js. Le code qui produit l’erreur ERR_HTTP_HEADERS_SENT sera légèrement différent du code Node.js.

Voici un exemple de code Express.js qui produira cette erreur :

const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => {
 res.send('Hello World!')
 res.setHeader('X-Foo', 'bar')
})
app.listen(port, () => {
 console.log(`Example app listening at http://localhost:${port}`)
})

Une fois que vous avez exécuté le serveur HTTP et bouclé le point de terminaison avec curl -i localhost:8080, votre terminal crachera l’erreur suivante :

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
   at ServerResponse.setHeader (_http_outgoing.js:561:11)
   at /Users/ssb/src/node-tmp/index.js:7:7

Le code ci-dessus produit cette erreur à cause de ce bloc :

app.get('/', (req, res) => {
 res.send('Hello World!')
 res.setHeader('X-Foo', 'bar')
})

Le corps du code est envoyé avant l’en-tête. Comme vous le savez, vous ne pouvez pas envoyer le corps avant l’en-tête. Corrigez ce problème en réécrivant votre code de la manière suivante :

app.get('/', (req, res) => {
 res.setHeader('X-Foo', 'bar')
 res.send('Hello World!')
})

Et c’est tout! C’est une solution simple pour une erreur frustrante.

Comment trouver cette erreur HTTP Node.js ?

Sans logiciel de surveillance des erreurs ou débogueur, le seul moyen de trouver cette erreur est de parcourir vos journaux. Avec des centaines, voire des milliers de lignes de code à parcourir, cela peut s’avérer être un long effort pour trouver une seule erreur. C’est là qu’intervient Airbrake Error and Performance Monitoring . Avec Airbrake Node.js et Express.js Error Monitoring , vous pouvez ignorer les journaux et accéder directement au code qui produit l’erreur ERR_HTTP_HEADERS_SENT.

Vous n’avez pas d’aérofrein ? Inscrivez-vous dès 30 jours sans risque pour un nombre essai Airbrake de aujourd’hui pour un illimité d’erreurs, d’utilisateurs illimités, de projets illimités et bien plus encore.

SeeSoon

Technicien supérieur en Informatique, Amateur en électronique Administrateur du site milbako, + 30 ans d'expériences. Je ne suis pas un spécialiste, contrairement à ce qu'on essaie parfois de me faire croire. Je ne suis d'ailleurs spécialiste en rien, ce qui est en accord avec ce que j'essaye de me faire croire. Je suis simplement bricoleur et me suis fait quelques idées au fil des ans.

Voir tous les articles de SeeSoon →

Laisser un commentaire

Translate »