web-dev-qa-db-fra.com

Erreur: entité de requête trop grande

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 instructions d'utilisation suivantes dans mon express.js

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

Dans fiddler, je peux voir l'en-tête content-length avec une valeur de: 1078702

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

Je ne sais pas pourquoi express ne me laisse pas poster le tableau json que je publiais précédemment dans un autre projet express qui n'utilisait pas la structure de projet moyenne.

348
mike james

J'ai eu la même erreur récemment et toutes les solutions que j'ai trouvées ne fonctionnaient pas.

Après quelques recherches, j’ai trouvé que le réglage de app.use(express.bodyParser({limit: '50mb'})); réglait correctement la limite. 

Lors de l'ajout d'un console.log('Limit file size: '+limit); dans node_modules/express/node_modules/connect/lib/middleware/json.js:46 et du redémarrage du nœud, j'obtiens 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 module connect, la limite est définie sur 1 Mo (1048576 octets). Ensuite, lorsque je définis la limite, le console.log est appelé à nouveau et cette fois, la limite est de 52428800 (50 Mo). Cependant, je reçois 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:10 et j'ai vu une autre ligne dans la console lors de l'appel de la route avec une requête volumineuse (avant la sortie d'erreur): 

Limit file size: 1048576

Cela signifie que quelque part, connect réinitialise le paramètre limit et ignore ce que nous avons spécifié. J'ai essayé de spécifier les paramètres bodyParser dans la définition de route individuellement, mais sans succès.

Bien que je n’aie trouvé aucun moyen approprié de le configurer de manière permanente, vous pouvez le "corriger" 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 . Notez que ceci est bad practice et qu'il sera écrasé si vous mettez à jour votre module.

Donc, cette solution temporaire fonctionne pour le moment, mais dès qu'une solution est trouvée (ou le module corrigé, s'il s'agit d'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.

[edit - a trouvé la solution]

Après quelques recherches et tests, j'ai constaté que lors du débogage, j'avais ajouté app.use(express.bodyParser({limit: '50mb'}));, mais afterapp.use(express.json());. Express définirait ensuite la limite globale sur 1 Mo. Le premier analyseur rencontré lors de l'exécution du script était express.json(). Déplacer bodyParser ci-dessus a fait l'affaire.

Cela dit, la méthode bodyParser() sera obsolète 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'}));

Si vous avez besoin de plusieurs parties (pour le téléchargement de fichiers), voir cet article .

Deuxième édition

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

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

Si l'option extended n'est pas explicitement définie pour bodyParser.urlencoded(), un avertissement (body-parser deprecated undefined extended: provide extended option) sera émis. En effet, cette option sera requise dans la prochaine version et not ne sera plus facultative. Pour plus d'informations sur l'option extended, veuillez vous reporter au readme du body-parser.

769
Samuel Bolduc

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 à la fonction urlencoded car la documentation l'indique et l'erreur ne s'affiche plus.

L'option parameterLimit contrôle le nombre maximal de paramètres qui sont autorisés dans les données encodées en URL. Si une demande contient plus de Si cette valeur est inférieure à 41, un 413 sera renvoyé 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}));
80
slorenzo

Si quelqu'un essayait toutes les réponses mais n'avait pas encore eu de succès et utilisait NGINX pour héberger le site, ajoutez cette ligne à/etc/nginx/sites-available

client_max_body_size 100M; #100mb
34
Alexander

Je ne pense pas que ce soit la limite de taille globale expresse, mais plus précisément la limite de middleware connect.json . Cela correspond à 100 Ko par défaut lorsque vous utilisez express.bodyParser() et ne fournissez pas d’option limit.

Essayer:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
28
Peter Lyons

dans mon cas .. paramètre parameterLimit:50000 résolu le problème

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
11
Mohanad Obaid

2016, rien de ce qui précède n'a fonctionné pour moi jusqu'à ce que je définisse explicitement le «type» en plus de la «limite» pour Bodyparser, 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-urlencoding' })

  app.use(jsonParser);
  app.use(urlencodedParser);
9
user1709076

Ce qui suit a fonctionné pour moi ... Il suffit d'utiliser 

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

c'est tout.

J'ai essayé tout ce qui précède et aucun n'a fonctionné. Constaté 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 sont ignorées.

Voir: https://github.com/expressjs/body-parser/issues/176 >> voir 'dougwilson a commenté le 17 juin 2016'

7
Vivek22

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

En utilisant 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);
        });
    });
};

Après plusieurs tentatives j'ai eu ma solution

J'ai commenté cette ligne

app.use(bodyParser.json());

et je mets

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

Puis ça marche

4
Maulik Patel

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

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

J'ai utilisé une autre pratique pour résoudre ce problème de dépendance multer.

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);
};
3
Quentin Malguy

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

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 trop importante mais sans raison valable. S'il n'y a aucune raison valable pour cela, réfléchissez à la raison pour laquelle il est si gonflé en premier lieu.

Notre propre expérience

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

3
Boaz

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

client_max_body_size 5M;

Redémarrez Nginx et les problèmes sont résolus

Sudo systemctl restart nginx
2
Jaime Fernandez

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

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

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

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

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

0
WasiF

La meilleure utilisation que vous pouvez spécifier la limite de la taille de votre fichier tel qu’il est montré dans la ligne donnée

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

Vous pouvez également modifier le paramètre par défaut dans l'analyseur de corps de modules de nœuds, puis dans le dossier lib, il existe un fichier JSON et un fichier texte. Puis changez 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})).

0
Ravi Beniwal

Pour moi, le principal truc est 

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

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

bodyParse.json en premier bodyParse.urlencoded second

0
Nicollas Matheus