Erro: solicitar entidade muito grande

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  (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:152:8), :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 

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

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

Dentro do violinista, posso ver o header do conteúdo com um valor de: 1078702

Eu acredito que isso é em octetos, isso é 1,0787 megabytes.

Eu não tenho idéia porque express não está me deixando postar o array json que eu estava postando anteriormente em outro projeto expresso que não estava usando a estrutura do projeto de pilha média.

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

Depois de algumas escavações, encontrei essa 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:46 e reiniciando o nó, 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, no início, ao carregar o módulo de connect , o limite é definido como 1mb (1048576 bytes). Então, quando eu definir o limite, o console.log é chamado novamente e desta vez o limite é 52428800 (50mb). No entanto, ainda tenho uma 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:10 e viu outra linha no console ao chamar a rota com uma grande requisição (antes da saída do erro):

 Limit file size: 1048576 

Isto significa que de alguma forma, em algum lugar, connect redefine o parâmetro limite e ignora o que especificamos. Eu tentei especificar os parâmetros bodyParser na definição de rota individualmente, mas também não bodyParser sorte.

Embora não tenha encontrado uma maneira correta de configurá-lo permanentemente, você pode ” corrigir ” o módulo diretamente. Se você estiver usando o Express 3.4.4, adicione isso 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. Por favor, note que esta é uma prática ruim e será sobrescrita se você atualizar seu módulo.

Portanto, esta 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 no módulo), você deverá atualizar seu código de acordo.

Eu abri um problema no Github sobre esse problema.

[edit – encontrou a solução]

Depois de algumas pesquisas e testes, descobri que, ao depurar, adicionei app.use(express.bodyParser({limit: '50mb'})); , mas depois de app.use(express.json()); . Express, em seguida, definir o limite global para 1 mb porque o primeiro analisador que ele encontrou ao executar o script foi express.json() . Movendo bodyParser acima, foi o truque.

Dito isso, o método bodyParser() 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 multipartes (para uploads de arquivos) veja este post .

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 methods json() e urlencoded() , da seguinte forma:

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

Se a opção extended não for explicitamente definida para bodyParser.urlencoded() , ele emitirá um aviso ( body-parser deprecated undefined extended: provide extended option bodyParser.urlencoded() 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 opção extended , consulte o leiame do body-parser de body-parser .

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

Eu tentei adicionar a opção parameterLimit na function urlencoded como a documentação diz e 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})); 

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

Experimentar:

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

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

 client_max_body_size 100M; #100mb 

2016, nenhum dos itens acima funcionou para mim até eu definir explicitamente o ‘tipo’ além do ‘limite’ para bodyparser, 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-urlencoding' }) app.use(jsonParser); app.use(urlencodedParser); 

no meu caso .. definindo parameterLimit:50000 resolveu o problema

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

O seguinte funcionou para mim … Basta usar

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

é isso aí.

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

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

somente o primeiro app.use(bodyParser()); um fica definido e as últimas duas linhas foram ignoradas.

Consulte: https://github.com/expressjs/body-parser/issues/176 >> ver ‘dougwilson Comentou em 17 de jun de 2016’

Pouco post antigo, mas eu tive o mesmo problema

Usando express 4. + meu código se parece com isso e funciona muito bem depois de 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); }); }); }; 

Eu usei outra prática para este problema com dependencies de 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); }; 

Uma abordagem ligeiramente diferente – a carga útil é muito grande

Todas as respostas úteis até agora lidam com o aumento do limite de carga útil. Mas também pode ser o caso de que a carga útil seja grande demais, mas sem uma boa razão. Se não houver uma razão válida para isso, considere investigar por que é tão inchado em primeiro lugar.

Nossa própria experiência

Por exemplo, no nosso caso, um aplicativo Angular enviava avidamente um object 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.