Error: entidad de solicitud demasiado grande

474

Recibo el siguiente error 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

Estoy usando meanstack. Tengo las siguientes declaraciones de uso en mi express.js

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

Dentro de Fiddler puedo ver el encabezado de longitud de contenido con un valor de: 1078702

Creo que esto está en octetos, esto es 1.0787 megabytes.

No tengo idea de por qué express no me permite publicar la matriz json que estaba publicando anteriormente en otro proyecto express que no estaba utilizando la estructura del proyecto stack medio.

Mike James
fuente
55
Nota rápida sobre esto para cualquier persona que venga a esta pregunta: asegúrese de que su problema sea en realidad el servidor de nodos o el analizador del cuerpo. Por ejemplo, estoy usando el analizador de cuerpo correctamente, pero recibí este error porque establecí el tamaño máximo del cuerpo en el archivo NGINX conf.
Stephen Tetreault
@StephenTetreault Creo que deberías agregar eso como respuesta, aunque, por supuesto, no se aplicará a todos, fue exactamente lo que me estaba pasando, felicitaciones.
Dado

Respuestas:

996

Recientemente tuve el mismo error y todas las soluciones que encontré no funcionaron.

Después de cavar un poco, descubrí que la configuración app.use(express.bodyParser({limit: '50mb'}));estableció el límite correctamente.

Al agregar una console.log('Limit file size: '+limit);en node_modules/express/node_modules/connect/lib/middleware/json.js:46y reiniciar el nodo, consigo esta salida en la consola:

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

Podemos ver que al principio, al cargar el connectmódulo, el límite se establece en 1 mb (1048576 bytes). Luego, cuando establezco el límite, console.logse vuelve a llamar y esta vez el límite es 52428800 (50mb). Sin embargo, sigo teniendo un 413 Request entity too large.

Luego añade console.log('Limit file size: '+limit);en node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10y vi otra línea en la consola cuando se llama a la ruta con un gran pedido (antes de la salida de error):

Limit file size: 1048576

Esto significa que de alguna manera, en algún lugar, connectrestablece el parámetro límite e ignora lo que especificamos. Intenté especificar los bodyParserparámetros en la definición de ruta individualmente, pero tampoco tuve suerte.

Si bien no encontré ninguna forma adecuada de configurarlo permanentemente, puede " parcharlo " directamente en el módulo. Si está utilizando Express 3.4.4, agregue esto en la línea 46 de node_modules/express/node_modules/connect/lib/middleware/json.js:

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

El número de línea puede diferir si no ejecuta la misma versión de Express. Tenga en cuenta que esta es una mala práctica y se sobrescribirá si actualiza su módulo.

Por lo tanto, esta solución temporal funciona por ahora, pero tan pronto como se encuentre una solución (o se arregle el módulo, en caso de que sea un problema del módulo), debe actualizar su código en consecuencia.

He abierto un problema en su GitHub sobre este problema.

[editar - encontró la solución]

Después de algunas investigaciones y pruebas, descubrí que al depurar, agregué app.use(express.bodyParser({limit: '50mb'}));, pero después app.use(express.json()); . Express establecería el límite global en 1mb porque el primer analizador que encontró al ejecutar el script fue express.json(). Mover por bodyParserencima hizo el truco.

Dicho esto, el bodyParser()método quedará en desuso en Connect 3.0 y no debe usarse. En su lugar, debe declarar sus analizadores explícitamente, así:

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

En caso de que necesite multiparte (para cargar archivos) vea esta publicación .

[segunda edición]

Tenga en cuenta que en Express 4, en lugar de express.json()y express.urlencoded(), debe requerir el módulo body-parser y usar sus métodos json()y urlencoded(), de esta manera:

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

Si la extendedopción no se define explícitamente para bodyParser.urlencoded(), arrojará una advertencia ( body-parser deprecated undefined extended: provide extended option). Esto se debe a que esta opción será necesaria en la próxima versión y ya no será opcional. Para obtener más información sobre la extendedopción, puede consultar el archivo Léame de body-parser.

[tercera edición]

Parece que en Express v4.16.0 en adelante, podemos volver a la forma inicial de hacerlo (gracias a @GBMan por el consejo):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
fuente
77
Mi problema fue que tenía el analizador express.json () sobre mi bodyParser ... Después de comprender cómo funciona todo, eliminé bodyParser y establecí el límite en el otro, como app.use(express.json({limit:'50mb'}));. ¡Edité mi respuesta para reflejar esto!
Samuel Bolduc
2
para express 4, el código indicado arroja "analizador de cuerpo en desuso extendido indefinido: proporcionar opción extendida" en la urlencodedllamada
Mike 'Pomax' Kamermans
3
Gracias por actualizar esto para express 4. ¡Eres un salvavidas!
Swills
36
Esto es tan completo como se obtiene esta respuesta, por lo que hay un punto más para referencia futura con el que me encontré si está usando nginx como proxy inverso frente a su instancia de node.js / express, que también es una práctica recomendada. Nginx lanzará la misma 413::Request Entity is too largeexcepción. No reenviará la solicitud a su aplicación express. Por lo tanto, necesitamos establecer client_max_body_size 50M;en la configuración de nginx O una configuración de servidor específica O incluso una etiqueta de ubicación específica funcionará.
Aukhan
3
Gracias samuel por esto! Me salvó de un mundo de dolor de cabeza, ¡salud y +1 por la respuesta integral!
BastianBuhrkall
118

Yo uso Express 4.

En mi caso, no fue suficiente agregar estas líneas:

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

Intenté agregar la opción parameterLimit en la función urlencoded como dice la documentación y el error ya no aparece.

La opción parameterLimit controla el número máximo de parámetros permitidos en los datos codificados en URL. Si una solicitud contiene más parámetros que este valor, se devolverá un 413 al cliente. El valor predeterminado es 1000.

Prueba con este código:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
slorenzo
fuente
El parámetro Limit era otro problema que me faltaba, gracias por señalar esto.
crowebird
1
Agregar el "parameterLimit: 50000" resuelve el problema.
Andrien Pecson
1
Estaba luchando tanto en esto hasta que encontré esta respuesta. ¡GRACIAS! #Relieve
Stephan Celis
¡Esto es exactamente lo que estaba buscando!
ApplePie
Estaba luchando con la solución marcada, pero esto ayuda mucho.
Ahmed Khan
55

Si alguien probó todas las respuestas, pero aún no ha tenido éxito y usa NGINX para alojar el sitio, agregue esta línea a / etc / nginx / sites-available

client_max_body_size 100M; #100mb
Alejandro
fuente
44
Este fue mi problema, gracias! Una pista es que el valor predeterminado de nginx es 1 MB, por lo que si parece estar limitado a esa cantidad, probablemente sea nginx. Además, otra pista: body-parser devolverá una limitpropiedad y una lengthpropiedad en el objeto de error (junto con status:413). Nginx no hace esto. Entonces, si no puede ver esas propiedades en el objeto de error, probablemente sea un límite nginx. A continuación, le indicamos cómo cambiar esta configuración nginx (los archivos de configuración probablemente /etc/nginx/sites-available/)
2
muchas gracias por esta respuesta, creo que esta respuesta debería ser votada porque es importante, personalmente me olvidé de la configuración de nginx ... nuevamente muchas gracias
Fadi Abo Msalam
¿Cómo establecer el límite solo en express?
alex dykyі
@ аlexdykyі Respuesta de Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
esto fue un problema! ¡gracias!
Víctor el
31

No creo que este sea el límite de tamaño global expreso, sino específicamente el límite de middleware connect.json . Esto es 100kb por defecto cuando lo usa express.bodyParser()y no proporciona una limitopción.

Tratar:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
fuente
1
Hola, estoy usando lo siguiente: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Todavía recibo el mismo error ...
mike james
el límite predeterminado es 100kbyte como parece ahora github.com/expressjs/body-parser#limit
Qiong Wu
15

en mi caso ... la configuración parameterLimit:50000solucionó el problema

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
fuente
Esto funcionó para mí. "Entidad de solicitud demasiado grande" parece referirse a cadenas grandes (como JSON) también. Estaba publicando ~ 20Kib JSON y tuve este problema (tenga en cuenta que el límite predeterminado de tamaño debody-parser carga útil está bien para mí). Se resolvió solo con (no es necesario establecer ninguna ). parameterLimitlimit
aesede
13

2016, ninguno de los anteriores funcionó para mí hasta que explicitamente configuré el 'tipo' además del 'límite' para bodyparser, por ejemplo:

  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);
usuario1709076
fuente
Sí, esto es lo que necesitaba hacer también. Y se ha configurado para que pueda controlar la configuración desde el script de su aplicación.
Robb Sadler
3
¿quiso decir application/x-www-form-urlencoded(en lugar de application/x-www-form-urlencoding)?
Granada
12

Lo siguiente funcionó para mí ... Solo use

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

Eso es.

Intenté todo lo anterior y ninguno funcionó. Descubrimos que a pesar de que usamos lo siguiente,

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

solo app.use(bodyParser());se define el primero y se ignoraron las dos últimas líneas.

Consulte: https://github.com/expressjs/body-parser/issues/176 >> vea 'dougwilson comentó el 17 de junio de 2016'

Vivek22
fuente
1
¡GRACIAS! También tenía un viejo app.use (bodyParser.json ()); en mi código antes y de hecho, ¡solo se toma el primero!
Nico
8

Para express ~ 4.16.0, express.json con límite funciona directamente

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

En mi caso, el problema estaba en la configuración de Nginx . Para resolverlo, tengo que editar el archivo: /etc/nginx/nginx.confy agregar esta línea dentro del bloque del servidor:

client_max_body_size 5M;

Reinicie Nginx y los problemas se han ido

sudo systemctl restart nginx
Jaime Fernández
fuente
5

He usado otra práctica para este problema con la dependencia de multer.

Ejemplo:

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
fuente
5

Pequeño post viejo pero tuve el mismo problema

Usando express 4. + mi código se ve así y funciona muy bien después de dos días de extensas pruebas.

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
fuente
4

Un enfoque ligeramente diferente: la carga útil es demasiado GRANDE

Todas las respuestas útiles hasta ahora tratan de aumentar el límite de carga útil. Pero también podría darse el caso de que la carga útil sea realmente demasiado grande, pero sin una buena razón. Si no hay una razón válida para que sea así, considera investigar por qué está tan hinchado en primer lugar.

Nuestra propia experiencia

Por ejemplo, en nuestro caso, una aplicación Angular enviaba con avidez un objeto completo en la carga útil. Cuando se eliminó una propiedad hinchada y redundante, el tamaño de la carga útil se redujo en un factor de 100 . Esto mejoró significativamente el rendimiento y resolvió el error 413.

Boaz - Restablece a Monica
fuente
4

Después de muchos intentos obtuve mi solución

He comentado esta linea

app.use(bodyParser.json());

y pongo

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

Entonces funciona

Maulik Patel
fuente
3

para mí el siguiente fragmento resolvió el problema.

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

El mejor uso puede especificar el límite del tamaño de su archivo como se muestra en las líneas dadas:

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

También puede cambiar la configuración predeterminada en el analizador de cuerpo de módulos de nodo y luego en la carpeta lib, hay archivos JSON y de texto. Entonces cambie el límite aquí. En realidad, esta condición pasa si no pasa el parámetro límite en la línea dada app.use (bodyParser.json ({limit: '10mb', extended: true})).

Ravi Beniwal
fuente
1

Yo también enfrenté ese problema, estaba cometiendo un error tonto al repetir lo app.use(bodyParser.json())siguiente a continuación:

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

quitando app.use(bodyParser.json()), resolvió el problema.

WasiF
fuente
1

En mi caso, la eliminación Content-typede los encabezados de solicitud funcionó.

carkod
fuente
0

Para mí el truco principal es

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

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

bodyParse.json primero bodyParse.urlencoded segundo

Nicollas
fuente
0

Si está utilizando express.json()y bodyParser juntos, dará error ya que express establece su propio límite.

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

elimine el código anterior y simplemente agregue el código siguiente

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
NIKIT PULEKAR
fuente
gracias por formatear @ tomislav-stankovic
NIKIT PULEKAR