Errore: entità richiesta troppo grande


474

Ricevo il seguente errore con 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

Sto usando meanstack. Ho le seguenti dichiarazioni d'uso nel mio express.js

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

All'interno di Fiddler posso vedere l'intestazione della lunghezza del contenuto con un valore di: 1078702

Credo che questo sia negli ottetti, questo è 1.0787 megabyte.

Non ho idea del perché express non mi consenta di pubblicare l'array json che stavo postando in precedenza in un altro progetto express che non utilizzava la struttura del progetto dello stack medio.


5
una breve nota al riguardo per chiunque venga a questa domanda: assicurati che il tuo problema sia in realtà il nodo server o il parser del corpo. Ad esempio sto usando correttamente il parser per il corpo ma ho ricevuto questo errore perché ho impostato la dimensione massima del corpo nel file conf NGINX.
Stephen Tetreault,

@StephenTetreault Penso che dovresti aggiungerlo come risposta, mentre ovviamente non si applica a tutti, è stato esattamente quello che mi stava succedendo, complimenti.
Dado,

Risposte:


996

Recentemente ho avuto lo stesso errore e tutte le soluzioni che ho trovato non funzionavano.

Dopo alcuni scavi, ho trovato quell'impostazione app.use(express.bodyParser({limit: '50mb'})); ha impostato correttamente il limite.

Quando aggiungo un nodo console.log('Limit file size: '+limit);in node_modules/express/node_modules/connect/lib/middleware/json.js:46e riavvio, ottengo questo output nella 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

Inizialmente possiamo vedere che, quando si carica il connectmodulo, il limite è impostato su 1mb (1048576 byte). Quindi, quando imposto il limite, console.logviene nuovamente chiamato e questa volta il limite è 52428800 (50mb). Tuttavia, ho ancora a 413 Request entity too large.

Poi ho aggiunto console.log('Limit file size: '+limit);in node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10e ho visto un'altra linea nella console quando si chiama il percorso con una grande richiesta (prima che l'uscita di errore):

Limit file size: 1048576

Ciò significa che in qualche modo, da qualche parte, connectreimposta il parametro limit e ignora ciò che abbiamo specificato. Ho provato a specificare i bodyParserparametri nella definizione del percorso singolarmente, ma neanche fortuna.

Anche se non ho trovato alcun modo corretto per impostarlo in modo permanente, è possibile " patch " direttamente nel modulo. Se si utilizza Express 3.4.4, aggiungerlo alla riga 46 di node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Il numero di riga potrebbe essere diverso se non si esegue la stessa versione di Express. Si noti che questa è una cattiva pratica e verrà sovrascritta se si aggiorna il modulo.

Quindi questa soluzione temporanea funziona per ora, ma non appena viene trovata una soluzione (o il modulo è riparato, nel caso si tratti di un problema del modulo) è necessario aggiornare il codice di conseguenza.

Ho aperto un problema sul loro GitHub su questo problema.

[modifica - ha trovato la soluzione]

Dopo alcune ricerche e prove, ho scoperto che durante il debug ho aggiunto app.use(express.bodyParser({limit: '50mb'}));, ma dopo app.use(express.json()); . Express imposterà quindi il limite globale a 1 MB perché il primo parser che ha incontrato durante l'esecuzione dello script era express.json(). Spostarsi bodyParsersopra ha fatto il trucco.

Detto questo, il bodyParser()metodo sarà deprecato in Connect 3.0 e non dovrebbe essere utilizzato. Invece, dovresti dichiarare esplicitamente i tuoi parser, in questo modo:

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

Se hai bisogno di più parti (per i caricamenti di file) vedi questo post .

[seconda modifica]

Si noti che in Express 4, anziché express.json()e express.urlencoded(), è necessario richiedere il modulo body-parser e utilizzare i relativi metodi json()e urlencoded(), in questo modo:

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

Se l' extendedopzione non è definita in modo esplicito per bodyParser.urlencoded(), verrà generato un avviso ( body-parser deprecated undefined extended: provide extended option). Questo perché questa opzione sarà richiesta nella prossima versione e non sarà più facoltativa. Per ulteriori informazioni extendedsull'opzione, è possibile fare riferimento al file Leggimi di body-parser.

[terza modifica]

Sembra che in Express v4.16.0 in poi, possiamo tornare al modo iniziale di farlo (grazie a @GBMan per il suggerimento):

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

7
Il mio problema era che avevo un parser express.json () sopra il mio bodyParser ... Dopo aver capito come funzionava, ho rimosso bodyParser e impostato il limite nell'altro, come app.use(express.json({limit:'50mb'}));. Ho modificato la mia risposta per riflettere questo!
Samuel Bolduc,

2
per express 4, il codice indicato genera "body-parser deprecato indefinito esteso: fornire un'opzione estesa" sulla urlencodedchiamata
Mike 'Pomax' Kamermans

3
Grazie per averlo aggiornato per Express 4. Sei un salvavita!
Swills

36
Questo è esaustivo quanto questa risposta ottiene, quindi c'è un altro punto per riferimento futuro che ho incontrato se stai usando nginx come proxy inverso di fronte alla tua istanza node.js / express, che è anche pratica consigliata. Nginx genererà la stessa 413::Request Entity is too largeeccezione. Non inoltrerà la richiesta all'app espressa. Quindi abbiamo bisogno di impostare client_max_body_size 50M;nella configurazione nginx O una configurazione server specifica O anche un tag di posizione specifico funzionerà.
Aukhan,

3
Grazie samuel per questo! Mi ha salvato da un mondo di mal di testa, Saluti e +1 per la risposta completa!
BastianBuhrkall,

118

Uso Express 4.

Nel mio caso non è stato sufficiente aggiungere queste righe:

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

Ho provato ad aggiungere l'opzione parametroLimit sulla funzione urlencoded come dice la documentazione e l'errore non appare più.

L'opzione parameterLimit controlla il numero massimo di parametri consentiti nei dati con codifica URL. Se una richiesta contiene più parametri di questo valore, un 413 verrà restituito al client. Il valore predefinito è 1000.

Prova con questo codice:

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

Il parametro Limite era un altro problema che mi mancava, grazie per averlo segnalato.
crowebird,

1
L'aggiunta di "parameterLimit: 50000" risolve il problema.
Andrien Pecson,

1
Stavo lottando così duramente fino a quando non ho trovato questa risposta. GRAZIE! #Relieve
Stephan Celis,

Questo e 'esattamente quello che stavo cercando!
ApplePie

Stavo lottando con la soluzione contrassegnata ma questo aiuta molto.
Ahmed Khan,

55

Se qualcuno ha provato tutte le risposte, ma non ha ancora avuto successo e utilizza NGINX per ospitare il sito, aggiungi questa riga a / etc / nginx / sites-available

client_max_body_size 100M; #100mb

4
Questo era il mio problema, grazie! Un indizio è che l'impostazione predefinita di nginx è 1 MB, quindi se sembri essere limitato a tale importo, probabilmente è nginx. Inoltre, un altro indizio: body-parser restituirà una limitproprietà e una lengthproprietà nell'oggetto errore (insieme a status:413). Nginx non lo fa. Quindi, se non riesci a vedere quelle proprietà nell'oggetto errore, probabilmente è un limite nginx. Ecco come modificare questa impostazione nginx (file di configurazione molto probabilmente in /etc/nginx/sites-available/)

2
grazie mille per questa risposta, credo che questa risposta debba essere votata perché è importante, personalmente ho dimenticato la configurazione di nginx ... ancora una volta grande grazie
Fadi Abo Msalam

Come impostare il limite solo in Express?
Alex Dykyі,

@ аlexdykyі Risposta di Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander

questo era un problema! grazie!
Victor,

31

Non penso che questo sia il limite di dimensione globale espresso, ma in particolare il limite del middleware connect.json . Si tratta di 100 kb per impostazione predefinita quando si utilizza express.bodyParser()e non si fornisce limitun'opzione.

Provare:

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

1
Ciao - Sto usando il seguente: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Ricevo ancora lo stesso errore ...
Mike James,

il limite predefinito è 100kbyte come sembra ora github.com/expressjs/body-parser#limit
Qiong Wu

15

nel mio caso ... l'impostazione ha parameterLimit:50000risolto il problema

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

Questo ha funzionato per me. "Richiesta entità troppo grande" sembra riferirsi anche a stringhe di grandi dimensioni (come JSON). Stavo pubblicando ~ 20Kib JSON e ho avuto questo problema (notare che il limite della dimensione delbody-parser payload predefinito è OK per me). È stato risolto solo con (non è necessario impostare alcun ). parameterLimitlimit
aesede

13

2016, nessuna delle precedenti ha funzionato per me fino a quando non ho impostato il 'tipo' oltre al 'limite' per bodyparser, ad esempio:

  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);

Sì, questo è quello che dovevo fare anche io. Ed è stato impostato in modo da poter guidare le impostazioni di configurazione dallo script dell'app.
Robb Sadler,

3
intendevi application/x-www-form-urlencoded(piuttosto che application/x-www-form-urlencoding)?
granata

12

Quanto segue ha funzionato per me ... Basta usare

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

questo è tutto.

Ho provato tutto sopra e nessuno ha funzionato. Ho scoperto che anche se usiamo come il seguente,

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

app.use(bodyParser());viene definita solo la prima e le ultime due righe sono state ignorate.

Fare riferimento: https://github.com/expressjs/body-parser/issues/176 >> vedi 'dougwilson ha commentato il 17 giu 2016'


1
GRAZIE! Avevo anche un vecchio app.use (bodyParser.json ()); nel mio codice prima e in effetti, solo il primo è preso!
Nico,

8

Per express ~ 4.16.0, express.json con limite funziona direttamente

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

6

Nel mio caso il problema riguardava la configurazione di Nginx . Per risolverlo devo modificare il file: /etc/nginx/nginx.confe aggiungere questa riga all'interno del blocco server:

client_max_body_size 5M;

Riavvia Nginx e i problemi sono spariti

sudo systemctl restart nginx

5

Ho usato un'altra pratica per questo problema con la dipendenza da multer.

Esempio:

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

5

Piccolo vecchio post ma ho avuto lo stesso problema

Usando express 4. + il mio codice appare così e funziona benissimo dopo due giorni di test approfonditi.

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

4

Un approccio leggermente diverso: il payload è troppo GRANDE

Tutte le risposte utili finora riguardano l'aumento del limite di carico utile. Ma potrebbe anche accadere che il payload sia davvero troppo grande, ma senza una buona ragione. Se non esiste un motivo valido per farlo, considera innanzitutto perché è così gonfio.

La nostra esperienza

Ad esempio, nel nostro caso, un'app angolare inviava avidamente un intero oggetto nel payload. Quando una proprietà gonfia e ridondante è stata rimossa, la dimensione del carico utile è stata ridotta di un fattore 100 . Ciò ha notevolmente migliorato le prestazioni e risolto l'errore 413.


4

Dopo molti tentativi ho ottenuto la mia soluzione

Ho commentato questa riga

app.use(bodyParser.json());

e ho messo

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

Quindi funziona


3

per me il seguente frammento ha risolto il problema.

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

2

L'uso migliore è possibile specificare il limite della dimensione del file come mostrato nelle righe indicate:

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

È inoltre possibile modificare l'impostazione predefinita nel parser del corpo dei moduli nodo, quindi nella cartella lib sono presenti file JSON e di testo. Quindi cambia limite qui. In realtà, questa condizione passa se non si passa il parametro limit nella riga app.use (bodyParser.json ({limit: '10mb', extended: true}).


1

Anch'io ho affrontato questo problema, stavo facendo uno sciocco errore ripetendo il app.use(bodyParser.json())seguente:

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

rimuovendo app.use(bodyParser.json()), risolto il problema.


1

Nel mio caso la rimozione Content-typedalle intestazioni della richiesta ha funzionato.


0

Per me il trucco principale è

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

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

bodyParse.json primo bodyParse.urlencoded secondo


0

Se stai usando express.json()e bodyParser insieme, si verificherà un errore poiché express imposta il proprio limite.

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

rimuovere il codice sopra e basta aggiungere il codice sotto

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));

grazie per la formattazione @ tomislav-stankovic
NIKIT PULEKAR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.