Dompter le « 413 Entity too large » avec ExpressJS

Alors pour remettre le contexte, j’avais développé une application sous NodeJS (avec ExpressJS et codé en CoffeeScript) pour importer un flux xml vers un wordpress. Tous les tests se sont bien déroulés, aucun problème majeur. Malheureusement je n’avais pas testé l’import de gros flux xml et « boum » une jolie erreur « 413 Entity too large » (Traitement abandonné dû à une requête trop importante).

Évidemment, cette erreur est courante et il est facile de trouver une solution sur Google. Alors au départ, pensant que c’était Nginx le fautif, je « patch » ma configuration dans nginx.conf:

Ajouter la ligne suivante au(x) contexte(s) http, server ou location pour augmenter la taille limite:

# set client body size to XM where X is a number #
client_max_body_size XM;

Hop, un petit nginx -t && nginx -s reload, la configuration passe et se recharge mais l’erreur est toujours présente. Après plusieurs essais je commence donc à m’impatienter est place donc des client_max_body_size dans tous les sens avec une limite frôlant le giga.

Rien n’y fait, cette ù$!!^ d’erreur me nargue toujours. Mais après 2 jours à ne plus y penser la solution m’apparaît de façon logique. Certes j’utlise Nginx comme serveur, mais qu’est-ce qu’il y a au-dessus ? Bah oui, ExpressJS, le con ! J’en avais complètement zappé la couche NodeJS. Ni une ni deux, je Google et hop, la solution se présente:

# C'est ça qui nous intéresse !
app.use bodyParser
  limit: "50mb"

 

Exemple:

...
bodyParser = require "body-parser"
debug = require("debug")("localhost")
fs = require "fs"

Xml = require "./libs/xml"
Import = require "./libs/import"

app = express()

app.set "port", process.env.PORT or 3000
app.set "views", path.join __dirname, "views"
app.set "view engine", "jade"
app.use favicon()
app.use logger "dev"

# C'est ça qui nous intéresse !
app.use bodyParser
  limit: "50mb"

app.use cookieParser()
app.use require("less-middleware")(path.join __dirname, "public")
app.use express.static(path.join __dirname, "public")
...

 

Il suffisait de paramétrer la limite du module « bodyParser »… Et là, miracle, je peux importer mon gros flux sans soucis, adieu le « 413 Entity too large » !

Leave a comment: