Erro: solicitar entidade muito grande

472

Estou recebendo o seguinte erro com 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

Estou usando o meanstack. Eu tenho as seguintes instruções de uso no meu express.js

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

No violinista, posso ver o cabeçalho de comprimento de conteúdo com um valor de: 1078702

Eu acredito que isso é em octetos, isso é 1.0787 megabytes.

Não sei por que o express não está me permitindo postar a matriz json que eu estava postando anteriormente em outro projeto expresso que não estava usando a estrutura do projeto de pilha média.

Mike James
fonte
5
observação rápida para qualquer pessoa que faça essa pergunta - verifique se o problema é realmente o servidor do nó ou o analisador de corpo. Por exemplo, estou usando o analisador de corpo corretamente, mas recebi esse erro porque devo definir o tamanho máximo do corpo no arquivo conf NGINX.
Stephen Tetreault
@StephenTetreault Acho que você deve adicionar isso como resposta, embora, é claro, não se aplique a todos, foi exatamente o que estava acontecendo comigo, parabéns.
Dado

Respostas:

993

Eu tive o mesmo erro recentemente e todas as soluções que encontrei não funcionaram.

Após algumas escavações, descobri que a configuração app.use(express.bodyParser({limit: '50mb'}));definiu o limite corretamente.

Ao adicionar um console.log('Limit file size: '+limit);em node_modules/express/node_modules/connect/lib/middleware/json.js:46e reiniciar nó, eu recebo esta saída no 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

Podemos ver que, a princípio, ao carregar o connectmódulo, o limite é definido como 1mb (1048576 bytes). Então, quando eu defino o limite, ele console.logé chamado novamente e, desta vez, o limite é 52428800 (50mb). No entanto, eu ainda recebo um 413 Request entity too large.

Então eu adicionei console.log('Limit file size: '+limit);em node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10e viu outra linha no console ao chamar a rota com um grande pedido (antes da saída de erro):

Limit file size: 1048576

Isso significa que, de alguma forma, em algum lugar, connectredefine o parâmetro limit e ignora o que especificamos. Tentei especificar os bodyParserparâmetros na definição de rota individualmente, mas também não tive sorte.

Embora eu não tenha encontrado nenhuma maneira adequada de configurá-lo permanentemente, você pode " corrigi- lo" diretamente no módulo. Se você estiver usando o Express 3.4.4, adicione-o na linha 46 de node_modules/express/node_modules/connect/lib/middleware/json.js:

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

O número da linha pode ser diferente se você não executar a mesma versão do Express. Observe que isso é uma prática ruim e será sobrescrita se você atualizar seu módulo.

Portanto, essa solução temporária funciona por enquanto, mas assim que uma solução for encontrada (ou o módulo for corrigido, caso seja um problema do módulo), você deverá atualizar seu código de acordo.

Eu abri um problema no GitHub sobre esse problema.

[edit - encontrou a solução]

Após algumas pesquisas e testes, descobri que, durante a depuração, eu adicionei app.use(express.bodyParser({limit: '50mb'}));, mas depois app.use(express.json()); . O Express configuraria o limite global para 1mb porque o primeiro analisador encontrado ao executar o script foi express.json(). Mover bodyParseracima fez o truque.

Dito isso, o bodyParser()método será preterido no Connect 3.0 e não deve ser usado. Em vez disso, você deve declarar seus analisadores explicitamente, assim:

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

Caso você precise de várias partes (para upload de arquivos), consulte esta publicação .

[segunda edição]

Observe que no Express 4, em vez de express.json()e express.urlencoded(), você deve exigir o módulo body-parser e usar seus métodos json()e urlencoded(), da seguinte maneira:

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

Se a extendedopção não estiver explicitamente definida bodyParser.urlencoded(), será emitido um aviso ( body-parser deprecated undefined extended: provide extended option). Isso ocorre porque essa opção será necessária na próxima versão e não será mais opcional. Para mais informações sobre a extendedopção, você pode consultar o leia - me de body-parser.

[terceira edição]

Parece que no Express v4.16.0 em diante, podemos voltar à maneira inicial de fazer isso (obrigado a @GBMan pela dica):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
fonte
7
Meu problema era que eu tinha o analisador express.json () acima do meu bodyParser ... Depois de entender como tudo funciona, eu removi o bodyParser e defini o limite no outro, como app.use(express.json({limit:'50mb'}));. Eu editei minha resposta para refletir isso!
Samuel Bolduc
2
para o express 4, o código indicado lança "analisador de corpo descontinuado indefinido estendido: forneça opção estendida" na urlencodedchamada
Mike 'Pomax' Kamermans
3
Obrigado por atualizar isso para o Express 4. Você é um salva-vidas!
Swills
36
Isso é tão abrangente quanto esta resposta, portanto, há mais um ponto para referência futura que encontrei se você estiver usando o nginx como um proxy reverso na frente de sua instância node.js / express, que também é uma prática recomendada. O Nginx lançará a mesma 413::Request Entity is too largeexceção. Ele não encaminhará a solicitação para o seu aplicativo expresso. Portanto, precisamos definir client_max_body_size 50M;na configuração do nginx OU uma configuração específica do servidor OU mesmo uma tag de localização específica funcionará.
Aukhan
3
Obrigado samuel por isso! Me salvou de um mundo de dor de cabeça, Felicidades e +1 pela resposta abrangente!
BastianBuhrkall
117

Eu uso o Express 4.

No meu caso, não foi suficiente adicionar estas linhas:

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

Tentei adicionar a opção parameterLimit na função urlencoded, conforme a documentação diz e o erro não aparece mais.

A opção parameterLimit controla o número máximo de parâmetros permitidos nos dados codificados por URL. Se uma solicitação contiver mais parâmetros que esse valor, um 413 será retornado ao cliente. O padrão é 1000.

Tente com 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
fonte
O parameterLimit foi outro problema que estava faltando, obrigado por apontar isso.
precisa
1
Adicionar o "parameterLimit: 50000" resolve o problema.
Andrien Pecson 8/08/19
1
Eu estava lutando tanto para encontrar essa resposta. OBRIGADO! #Relieve
Stephan Celis
Era exatamente isso que eu estava procurando!
ApplePie
Eu estava lutando com a solução marcada, mas isso ajuda muito.
Ahmed Khan
55

Se alguém tentou todas as respostas, mas ainda não obteve sucesso e usa o NGINX para hospedar o site, adicione esta linha a / etc / nginx / sites-available

client_max_body_size 100M; #100mb
Alexander
fonte
4
Este foi o meu problema, obrigado! Uma pista é que o padrão do nginx é 1 MB; portanto, se você parece estar limitado a esse valor, provavelmente é o nginx. Além disso, outra pista: body-parser retornará uma limitpropriedade e uma lengthpropriedade no objeto de erro (junto com status:413). O Nginx não faz isso. Portanto, se você não pode ver essas propriedades no objeto de erro, provavelmente é um limite de nginx. Aqui está como alterar essa configuração nginx (arquivos de configuração mais provável em /etc/nginx/sites-available/)
2
muito obrigado por esta resposta eu acredito esta resposta deve ser upvoted, porque é importante, pessoalmente, eu esqueci sobre nginx configuração ... novamente grande obrigado
Fadi Abo Msalam
Como definir limite apenas no expresso?
dykyі аlex
@ аlexdykyі Resposta de Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
isso foi um problema! obrigado!
Victor
31

Eu não acho que esse seja o limite de tamanho global expresso, mas especificamente o limite do middleware connect.json . Isso é 100kb por padrão quando você usa express.bodyParser()e não fornece uma limitopção.

Tentar:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
fonte
1
Oi - Estou usando o seguinte: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Eu ainda estou recebendo o mesmo erro ...
james microfone
o limite padrão é de 100kbyte como parece agora github.com/expressjs/body-parser#limit
Qiong Wu
15

no meu caso .. configuração parameterLimit:50000corrigiu o problema

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
fonte
Isso funcionou para mim. "Solicitar entidade muito grande" parece se referir a cadeias grandes (como JSON) também. Eu estava postando ~ 20Kib JSON e tive esse problema (observe que o limite de tamanho dabody-parser carga útil padrão é bom para mim). Foi resolvido apenas (não é necessário definir nenhum ). parameterLimitlimit
aesede
13

2016, nenhuma das opções acima funcionou para mim até que eu explicitamente defina o 'tipo' além do 'limite' para bodyparser, por exemplo:

  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
fonte
Sim, é isso que eu também precisava fazer. E foi configurado para que você possa conduzir as configurações do script do seu aplicativo.
Robb Sadler
3
você quis dizer application/x-www-form-urlencoded(ao invés de application/x-www-form-urlencoding)?
granada
12

O seguinte funcionou para mim ... Basta usar

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

é isso aí.

Tentei tudo acima e nenhum funcionou. Verificou que, embora usemos o seguinte,

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

somente o primeiro app.use(bodyParser());é definido e as duas últimas linhas são ignoradas.

Consulte: https://github.com/expressjs/body-parser/issues/176 >> veja 'dougwilson comentou em 17 de junho de 2016'

Vivek22
fonte
1
OBRIGADO! Eu também tinha um app.use antigo (bodyParser.json ()); no meu código antes e de fato, apenas o primeiro é usado!
Nico
8

Para express ~ 4.16.0, express.json com limite trabalha diretamente

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

No meu caso, o problema estava na configuração do Nginx . Para resolvê-lo, tenho que editar o arquivo: /etc/nginx/nginx.confe adicionar esta linha dentro do bloco do servidor:

client_max_body_size 5M;

Reinicie o Nginx e os problemas desapareceram

sudo systemctl restart nginx
Jaime Fernandez
fonte
5

Eu usei outra prática para esse problema com dependência multer.

Exemplo:

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

Post antigo, mas tive o mesmo problema

Usando express 4. +, meu código se parece com isso e funciona muito bem após dois dias de testes extensivos.

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

Uma abordagem um pouco diferente - a carga útil é muito GRANDE

Até agora, todas as respostas úteis lidam com o aumento do limite de carga útil. Mas também pode ser que a carga útil seja realmente muito grande, mas sem uma boa razão. Se não houver um motivo válido para isso, considere analisar por que está tão inchado em primeiro lugar.

Nossa própria experiência

Por exemplo, no nosso caso, um aplicativo Angular estava enviando avidamente um objeto inteiro na carga útil. Quando uma propriedade inchada e redundante foi removida, o tamanho da carga útil foi reduzido em um fator de 100 . Isso melhorou significativamente o desempenho e resolveu o erro 413.

Boaz - Restabelecer Monica
fonte
4

Depois de muitas tentativas, consegui minha solução

Eu comentei esta linha

app.use(bodyParser.json());

e eu coloquei

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

Então funciona

Maulik Patel
fonte
3

para mim, o seguinte trecho resolveu o problema.

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

O melhor uso que você pode especificar é o limite do tamanho do arquivo, conforme mostrado nas linhas fornecidas:

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

Você também pode alterar a configuração padrão no node-modules body-parser e, na pasta lib, há JSON e arquivo de texto. Então mude o limite aqui. Na verdade, essa condição será aprovada se você não passar o parâmetro limit na linha app.use (bodyParser.json ({limit: '10mb', extended: true})).

Ravi Beniwal
fonte
1

Eu também enfrentei esse problema, estava cometendo um erro bobo repetindo o app.use(bodyParser.json())seguinte abaixo:

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

removendo app.use(bodyParser.json()), resolveu o problema.

WasiF
fonte
1

No meu caso, remover Content-typeos cabeçalhos da solicitação funcionou.

carkod
fonte
0

Para mim, o principal truque é

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

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

bodyParse.json primeiro bodyParse.urlencoded segundo

Nicollas
fonte
0

Se você estiver usando express.json()e bodyParser juntos vai dar erro como expresso define seu próprio limite.

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

remova o código acima e apenas adicione o código abaixo

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