Erreur: entité de requête trop grande

474

Je reçois l'erreur suivante avec express:

Error: request entity too large
    at module.exports (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/node_modules/raw-body/index.js:16:15)
    at json (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/json.js:60:5)
    at Object.bodyParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:53:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.cookieParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.logger (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/logger.js:158:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.staticMiddleware [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/static.js:55:61)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
TypeError: /Users/michaeljames/Documents/Projects/Proj/mean/app/views/includes/foot.jade:31
    29| script(type="text/javascript", src="/js/socketio/connect.js")
    30| 
  > 31| if (req.host='localhost')
    32|     //Livereload script rendered 
    33|     script(type='text/javascript', src='http://localhost:35729/livereload.js')  
    34| 

Cannot set property 'host' of undefined
    at eval (eval at <anonymous> (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:152:8), <anonymous>:273:15)
    at /Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:153:35
    at Object.exports.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:197:10)
    at Object.exports.renderFile (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:233:18)
    at View.exports.renderFile [as engine] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:218:21)
    at View.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/view.js:76:8)
    at Function.app.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/application.js:504:10)
    at ServerResponse.res.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/response.js:801:7)
    at Object.handle (/Users/michaeljames/Documents/Projects/Proj/mean/config/express.js:82:29)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:188:17)

POST /api/0.1/people 500 618ms

J'utilise meanstack. J'ai les déclarations d'utilisation suivantes dans mon express.js

//Set Request Size Limit
app.use(express.limit(100000000));

Dans le violon, je peux voir l'en-tête de la longueur du contenu avec une valeur de: 1078702

Je crois que c'est en octets, c'est 1,0787 mégaoctets.

Je n'ai aucune idée pourquoi express ne me laisse pas publier le tableau json que je publiais précédemment dans un autre projet express qui n'utilisait pas la structure de projet de pile moyenne.

Mike James
la source
5
note rapide à ce sujet à tous ceux qui se posent cette question - assurez-vous que votre problème est bien le serveur de noeud ou l'analyseur de corps. Par exemple, j'utilise correctement l'analyseur de corps, mais j'ai obtenu cette erreur car je dois définir la taille maximale du corps dans le fichier de configuration NGINX.
Stephen Tetreault
@StephenTetreault Je pense que vous devriez ajouter que comme réponse, bien que cela ne s'applique pas à tout le monde, c'est exactement ce qui m'arrivait, bravo.
Dado

Réponses:

996

J'ai eu la même erreur récemment, et toutes les solutions que j'ai trouvées n'ont pas fonctionné.

Après avoir creusé, j'ai trouvé que le réglage app.use(express.bodyParser({limit: '50mb'}));fixait correctement la limite.

Lorsque vous ajoutez un console.log('Limit file size: '+limit);dans node_modules/express/node_modules/connect/lib/middleware/json.js:46et noeud redémarrage, je reçois cette sortie dans la console:

Limit file size: 1048576
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
Limit file size: 52428800
Express server listening on port 3002

Nous pouvons voir qu'au début, lors du chargement du connectmodule, la limite est fixée à 1 Mo (1048576 octets). Ensuite, lorsque j'ai défini la limite, le console.logest appelé à nouveau et cette fois, la limite est 52428800 (50 Mo). Cependant, j'obtiens toujours un 413 Request entity too large.

Puis j'ai ajouté console.log('Limit file size: '+limit);dans node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10et vu une autre ligne dans la console lors de l' appel de la route avec une grande demande (avant la sortie d'erreur):

Limit file size: 1048576

Cela signifie qu'en quelque sorte, quelque part, connectréinitialise le paramètre de limite et ignore ce que nous avons spécifié. J'ai essayé de spécifier les bodyParserparamètres dans la définition de l'itinéraire individuellement, mais pas de chance non plus.

Bien que je n'aie trouvé aucun moyen approprié de le définir de manière permanente, vous pouvez le " patcher " directement dans le module. Si vous utilisez Express 3.4.4, ajoutez ceci à la ligne 46 de node_modules/express/node_modules/connect/lib/middleware/json.js:

limit = 52428800; // for 50mb, this corresponds to the size in bytes

Le numéro de ligne peut différer si vous n'exécutez pas la même version d'Express. Veuillez noter qu'il s'agit d'une mauvaise pratique et qu'elle sera remplacée si vous mettez à jour votre module.

Cette solution temporaire fonctionne donc pour l'instant, mais dès qu'une solution est trouvée (ou que le module est corrigé, au cas où ce serait un problème de module), vous devez mettre à jour votre code en conséquence.

J'ai ouvert un problème sur leur GitHub à propos de ce problème.

[modifier - trouvé la solution]

Après quelques recherches et tests, j'ai trouvé que lors du débogage, j'ai ajouté app.use(express.bodyParser({limit: '50mb'}));, mais après app.use(express.json()); . Express définissait alors la limite globale à 1 Mo, car le premier analyseur qu'il avait rencontré lors de l'exécution du script était express.json(). Se déplacer bodyParserau-dessus a fait l'affaire.

Cela dit, la bodyParser()méthode sera déconseillée dans Connect 3.0 et ne devrait pas être utilisée. Au lieu de cela, vous devez déclarer explicitement vos analyseurs, comme ceci:

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));

Dans le cas où vous avez besoin de plusieurs parties (pour les téléchargements de fichiers), consultez cet article .

[deuxième édition]

Notez que dans Express 4, au lieu de express.json()et express.urlencoded(), vous devez exiger le module body-parser et utiliser ses méthodes json()et urlencoded(), comme ceci:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

Si l' extendedoption n'est pas explicitement définie pour bodyParser.urlencoded(), elle lancera un avertissement ( body-parser deprecated undefined extended: provide extended option). En effet, cette option sera requise dans la prochaine version et ne sera plus optionnelle. Pour plus d'informations sur l' extendedoption, vous pouvez vous référer au fichier Lisez - moi de body-parser.

[troisième édition]

Il semble que dans Express v4.16.0, nous pouvons revenir à la manière initiale de le faire (merci à @GBMan pour l'astuce):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
la source
7
Mon problème était que j'avais l'analyseur express.json () au-dessus de mon bodyParser ... Après avoir compris comment tout cela fonctionnait, j'ai supprimé bodyParser et défini la limite de l'autre, comme app.use(express.json({limit:'50mb'}));. J'ai modifié ma réponse pour refléter cela!
Samuel Bolduc
2
pour express 4, le code indiqué renvoie "analyseur de corps obsolète étendu non défini: fournir une option étendue" lors de l' urlencodedappel
Mike 'Pomax' Kamermans
3
Merci d'avoir mis à jour ceci pour express 4. Vous êtes un épargnant de vie!
Swills
36
C'est aussi complet que cette réponse, il y a donc un point de référence supplémentaire que j'ai rencontré si vous utilisez nginx comme proxy inverse devant votre instance node.js / express, ce qui est également recommandé. Nginx lèvera la même 413::Request Entity is too largeexception. Il ne transmettra pas la demande à votre application express. Nous devons donc définir client_max_body_size 50M;dans la configuration nginx OU une configuration de serveur spécifique OU même une balise d'emplacement spécifique fonctionnera.
Aukhan
3
Merci samuel pour ça! M'a sauvé d'un monde de maux de tête, Cheers et +1 pour la réponse complète!
BastianBuhrkall
118

J'utilise Express 4.

Dans mon cas, il ne suffisait pas d'ajouter ces lignes:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

J'ai essayé d'ajouter l'option parameterLimit sur la fonction urlencoded comme le dit la documentation et l'erreur n'apparaît plus.

L'option parameterLimit contrôle le nombre maximal de paramètres autorisés dans les données encodées URL. Si une demande contient plus de paramètres que cette valeur, un 413 sera retourné au client. La valeur par défaut est 1000.

Essayez avec ce code:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
slorenzo
la source
Le parameterLimit était un autre problème que je manquais, merci de l'avoir signalé.
crowebird
1
L'ajout du "parameterLimit: 50000" résout le problème.
Andrien Pecson
1
Je me battais si fort jusqu'à ce que je trouve cette réponse. MERCI! #Relieve
Stephan Celis
Ceci est exactement ce que je cherchais!
ApplePie
Je me débattais avec la solution marquée mais cela aide beaucoup.
Ahmed Khan
55

Si quelqu'un a essayé toutes les réponses, mais n'a pas encore réussi et utilise NGINX pour héberger le site, ajoutez cette ligne à / etc / nginx / sites-available

client_max_body_size 100M; #100mb
Alexandre
la source
4
C'était mon problème, merci! Un indice est que la valeur par défaut de nginx est de 1 Mo, donc si vous semblez être limité à ce montant, c'est probablement nginx. En outre, un autre indice: body-parser renverra une limitpropriété et une lengthpropriété dans l'objet d'erreur (avec status:413). Nginx ne fait pas ça. Donc, si vous ne pouvez pas voir ces propriétés dans l'objet d'erreur, c'est probablement une limite nginx. Voici comment modifier ce paramètre nginx (les fichiers de configuration sont très probablement dans /etc/nginx/sites-available/)
2
merci beaucoup pour cette réponse je crois que cette réponse devrait être votée car elle est importante, personnellement j'ai oublié la configuration de nginx ... encore une fois grand merci
Fadi Abo Msalam
Comment fixer la limite uniquement en express?
Alex Dykyі
@ аlexdykyі Réponse de Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
c'était un problème! Merci!
Victor
31

Je ne pense pas que ce soit la limite de taille globale expresse, mais spécifiquement la limite du middleware connect.json . C'est 100 Ko par défaut lorsque vous utilisez express.bodyParser()et ne fournissez pas d' limitoption.

Essayer:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
la source
1
Salut - J'utilise les éléments suivants: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Je reçois toujours la même erreur ...
Mike James
la limite par défaut est de 100 Ko, comme il semble maintenant github.com/expressjs/body-parser#limit
Qiong Wu
15

dans mon cas .. le réglage a parameterLimit:50000résolu le problème

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
la source
Cela a fonctionné pour moi. "Request entity too large" semble également faire référence à de grandes chaînes (comme JSON). Je publiais ~ 20Kib JSON et j'ai eu ce problème (notez que la limite de taille debody-parser charge utile par défaut est OK pour moi). A été résolu avec seulement (pas besoin de définir de s). parameterLimitlimit
aesede
13

2016, rien de ce qui précède n'a fonctionné pour moi jusqu'à ce que j'explique explicitement le `` type '' en plus de la `` limite '' pour le bodyparser, par exemple:

  var app = express();
  var jsonParser       = bodyParser.json({limit:1024*1024*20, type:'application/json'});
  var urlencodedParser = bodyParser.urlencoded({ extended:true,limit:1024*1024*20,type:'application/x-www-form-urlencoded' })

  app.use(jsonParser);
  app.use(urlencodedParser);
user1709076
la source
Oui, c'est aussi ce que je devais faire. Et il a été configuré pour que vous puissiez gérer les paramètres de configuration à partir du script de votre application.
Robb Sadler
3
vouliez-vous dire application/x-www-form-urlencoded(plutôt que application/x-www-form-urlencoding)?
grenade
12

Ce qui suit a fonctionné pour moi ... Utilisez simplement

app.use(bodyParser({limit: '50mb'}));

c'est ça.

J'ai essayé tout au-dessus et aucun n'a fonctionné. Trouvé que même si nous utilisons comme suit,

app.use(bodyParser());
app.use(bodyParser({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb'}));

seule la 1ère app.use(bodyParser());est définie et les deux dernières lignes ont été ignorées.

Référez-vous à: https://github.com/expressjs/body-parser/issues/176 >> voir 'dougwilson commenté le 17 juin 2016'

Vivek22
la source
1
MERCI! J'ai également eu un ancien app.use (bodyParser.json ()); dans mon code avant et en effet, seul le premier est pris!
Nico
8

Pour express ~ 4.16.0, express.json avec limite fonctionne directement

app.use(express.json({limit: '50mb'}));
Stenal P Jolly
la source
6

Dans mon cas, le problème était sur la configuration de Nginx . Pour le résoudre, je dois éditer le fichier: /etc/nginx/nginx.confet ajouter cette ligne dans le bloc serveur:

client_max_body_size 5M;

Redémarrez Nginx et les problèmes ont disparu

sudo systemctl restart nginx
Jaime Fernandez
la source
5

J'ai utilisé une autre pratique pour ce problème avec la dépendance du mulet.

Exemple:

multer = require('multer');

var uploading = multer({
  limits: {fileSize: 1000000, files:1},
});

exports.uploadpictureone = function(req, res) {
  cloudinary.uploader.upload(req.body.url, function(result) {
    res.send(result);
  });
};

module.exports = function(app) {
    app.route('/api/upload', uploading).all(uploadPolicy.isAllowed)
        .post(upload.uploadpictureone);
};
Quentin Malguy
la source
5

Petit vieux poste mais j'ai eu le même problème

Utiliser express 4. + mon code ressemble à ceci et il fonctionne très bien après deux jours de tests approfondis.

var url         = require('url'),
    homePath    = __dirname + '/../',
    apiV1       = require(homePath + 'api/v1/start'),
    bodyParser  = require('body-parser').json({limit:'100mb'});

module.exports = function(app){
    app.get('/', function (req, res) {
        res.render( homePath + 'public/template/index');
    });

    app.get('/api/v1/', function (req, res) {
        var query = url.parse(req.url).query;
        if ( !query ) {
            res.redirect('/');
        }
        apiV1( 'GET', query, function (response) {
            res.json(response);
        });
    });

    app.get('*', function (req,res) {
        res.redirect('/');
    });

    app.post('/api/v1/', bodyParser, function (req, res) {
        if ( !req.body ) {
            res.json({
                status: 'error',
                response: 'No data to parse'
            });
        }
        apiV1( 'POST', req.body, function (response) {
            res.json(response);
        });
    });
};
Alexander Sasha Shcherbakov
la source
4

Une approche légèrement différente - la charge utile est trop GRANDE

Jusqu'à présent, toutes les réponses utiles concernent l'augmentation de la limite de charge utile. Mais il se peut aussi que la charge utile soit en effet trop grande mais sans raison valable. S'il n'y a aucune raison valable pour cela, envisagez d'abord pourquoi il est si gonflé.

Notre propre expérience

Par exemple, dans notre cas, une application Angular envoyait goulûment un objet entier dans la charge utile. Lorsqu'une propriété gonflée et redondante a été supprimée, la taille de la charge utile a été réduite d'un facteur 100 . Cela a considérablement amélioré les performances et résolu l'erreur 413.

Boaz - Rétablir Monica
la source
4

Après many de nombreux essais, j'ai obtenu ma solution

J'ai commenté cette ligne

app.use(bodyParser.json());

et je mets

app.use(bodyParser.json({limit: '50mb'}))

Alors ça marche

Maulik Patel
la source
3

pour moi, l'extrait suivant a résolu le problème.

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'})); 
Sanjeeva Kumar Acham
la source
2

Pour une meilleure utilisation, vous pouvez spécifier la limite de la taille de votre fichier comme indiqué dans les lignes données:

app.use(bodyParser.json({limit: '10mb', extended: true}))
app.use(bodyParser.urlencoded({limit: '10mb', extended: true}))

Vous pouvez également modifier le paramètre par défaut dans node-modules body-parser puis dans le dossier lib, il y a JSON et le fichier texte. Modifiez ensuite la limite ici. En fait, cette condition passe si vous ne passez pas le paramètre limit dans la ligne donnée app.use (bodyParser.json ({limit: '10mb', extended: true})).

Ravi Beniwal
la source
1

Moi aussi, j'ai fait face à ce problème, je faisais une erreur stupide en répétant ce qui app.use(bodyParser.json())suit ci-dessous:

app.use(bodyParser.json())
app.use(bodyParser.json({ limit: '50mb' }))

en supprimant app.use(bodyParser.json()), résolu le problème.

WasiF
la source
1

Dans mon cas, la suppression Content-typedes en-têtes de demande a fonctionné.

carkod
la source
0

Pour moi, le truc principal est

app.use(bodyParser.json({
  limit: '20mb'
}));

app.use(bodyParser.urlencoded({
  limit: '20mb',
  parameterLimit: 100000,
  extended: true 
}));

bodyParse.json premier bodyParse.urlencoded deuxième

Nicollas
la source
0

Si vous utilisez express.json()et bodyParser ensemble, cela donnera une erreur car express définit sa propre limite.

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

supprimer le code ci-dessus et ajouter simplement le code ci-dessous

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
NIKIT PULEKAR
la source
merci pour le formatage @ tomislav-stankovic
NIKIT PULEKAR