Hata: istek varlığı çok büyük


475

Express ile aşağıdaki hatayı alıyorum:

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

Araç kullanma kullanıyorum. Benim express.js aşağıdaki kullanım ifadeleri var

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

Kemancı içinde, içerik uzunluğu başlığını şu değerlerle görebilirim: 1078702

Bunun sekizlide olduğuna inanıyorum, bu 1.0787 megabayt.

Neden ekspres bana daha önce ortalama yığın proje yapısını kullanmayan başka bir ekspres projede yayınlamak json dizi göndermek izin vermiyor hiç bir fikrim yok.


5
Bu soruya gelen herkese hızlı bir not - Sorununuzun aslında düğüm sunucusu veya gövde ayrıştırıcı olduğundan emin olun. Örneğin vücut ayrıştırıcıyı doğru kullanıyorum ama NGINX conf dosyasındaki maksimum vücut boyutunu ayarlamak için bu hatayı aldım.
Stephen Tetreault

@StephenTetreault Sanırım bunu bir cevap olarak eklemelisiniz, tabii ki herkes için geçerli olmazken, tam olarak bana olan buydu, kudos.
Dado

Yanıtlar:


997

Son zamanlarda aynı hatayla karşılaştım ve bulduğum tüm çözümler işe yaramadı.

Bazı kazmalardan sonra, ayarın app.use(express.bodyParser({limit: '50mb'}));sınırı doğru ayarladığını gördüm .

Bir eklerken console.log('Limit file size: '+limit);içinde node_modules/express/node_modules/connect/lib/middleware/json.js:46ve düğüm yeniden başlatmayı, ben konsolda sonuç alırsınız:

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

İlk olarak, connectmodülü yüklerken sınırın 1mb (1048576 bayt) olarak ayarlandığını görebiliriz. Daha sonra limiti ayarladığımda, console.logtekrar çağrılır ve bu sefer limit 52428800 (50mb) olur. Ancak yine de a 413 Request entity too large.

Sonra ekledi console.log('Limit file size: '+limit);içinde node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10ve (hata çıktı öncesi) büyük bir istekle rotayı çağıran konsolda başka bir çizgi gördük:

Limit file size: 1048576

Bu, bir şekilde bir yerde connectlimit parametresini sıfırladığı ve belirlediğimiz şeyi göz ardı ettiği anlamına gelir . bodyParserRota tanımındaki parametreleri ayrı ayrı belirlemeye çalıştım , ama ya da şans yok.

Kalıcı olarak ayarlamak için uygun bir yol bulamamam da doğrudan modüle " yama " yapabilirsiniz . Express 3.4.4 kullanıyorsanız, bunu aşağıdakilerin 46. satırına ekleyin node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Aynı Express sürümünü çalıştırmazsanız satır numarası farklı olabilir. Bunun kötü bir uygulama olduğunu ve modülünüzü güncellerseniz bunun üzerine yazılacağını lütfen unutmayın .

Bu geçici çözüm şimdilik işe yarıyor, ancak bir çözüm bulunur bulunmaz (veya modül sorunu varsa modül sabitlenir) kodunuzu buna göre güncellemelisiniz.

GitHub'ında bu sorunla ilgili bir sorun açtım .

[değiştir - çözümü buldu]

Bazı araştırma ve testlerden sonra, hata ayıklarken ekledim app.use(express.bodyParser({limit: '50mb'}));, ama sonra buldum app.use(express.json());. Daha sonra Express, komut dosyasını çalıştırırken karşılaştığı ilk ayrıştırıcı olduğu için global sınırı 1mb olarak ayarlar express.json(). Üstüne geçmek bodyParserhile yaptı.

Bununla birlikte, bodyParser()yöntem Connect 3.0'da kullanımdan kaldırılacak ve kullanılmamalıdır. Bunun yerine, ayrıştırıcılarınızı açık bir şekilde beyan etmelisiniz, şöyle:

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

Çok parçaya ihtiyacınız varsa (dosya yüklemeleri için) bu gönderiye bakın .

[ikinci düzenleme]

Express 4'te yerine geldiğini hatırlatırız express.json()ve express.urlencoded(), size gereken gerekir vücut ayrıştırıcı modülü ve onun kullanmak json()ve urlencoded()böylece gibi yöntemler:

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

Eğer extendedseçenek açıkça için tanımlı değil bodyParser.urlencoded(), bu bir uyarı atmak olacaktır ( body-parser deprecated undefined extended: provide extended option). Bunun nedeni, bu seçeneğin bir sonraki sürümde gerekli olması ve artık isteğe bağlı olmamasıdır . Hakkında daha fazla bilgi için extendedseçenek, sen başvurabilirsiniz readme arasında body-parser.

[üçüncü düzenleme]

Express v4.16.0 ve sonrasında, bunu yapmanın ilk yoluna geri dönebiliriz (ipucu için @GBMan sayesinde):

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

7
Benim sorunum, bodyParser yukarıda express.json () ayrıştırıcı vardı ... Tüm bunların nasıl çalıştığını anladıktan sonra bodyParser kaldırıldı ve diğer de de sınır koymak app.use(express.json({limit:'50mb'}));. Cevabımı bunu yansıtacak şekilde düzenledim!
Samuel Bolduc

2
ekspres 4 için, belirtilen kod urlencodedçağrıda "gövde ayrıştırıcısı tanımlanmamış genişletilmiş: genişletilmiş seçenek sunar" atar
Mike 'Pomax' Kamermans

3
Express 4 için bunu güncellediğiniz için teşekkür ederiz. Bir hayat kurtarıcısınız!
Swills

36
Bu, bu cevabın aldığı kadar kapsamlı, bu yüzden gelecekte uygulama için önerilen node.js / express örneğinizin önünde nginx'i ters proxy olarak kullanıyorsanız, ileride başvurmak için bir nokta daha var. Nginx de aynı 413::Request Entity is too largeistisnayı atacak . Ekspres uygulamanıza isteği iletmeyecektir. Bu nedenle client_max_body_size 50M;, nginx config VEYA belirli bir sunucu yapılandırması VEYA belirli bir konum etiketi bile çalışacaktır.
Aukhan

3
Bunun için samuel teşekkür ederim! Kapsamlı cevap için beni baş ağrısı, Şerefe ve +1 dünyasından kurtardım!
BastianBuhrkall

118

Express 4 kullanıyorum.

Benim durumumda bu satırları eklemek yeterli değildi:

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

Belgelerin söylediği ve hata artık görünmüyor gibi urlencoded işlevi Parametrimit seçeneği eklemeyi denedim.

ParametresiLimit seçeneği, URL kodlu verilerde izin verilen maksimum parametre sayısını kontrol eder. Bir istek bu değerden daha fazla parametre içeriyorsa, istemciye bir 413 döndürülür. Varsayılan değer 1000'dir.

Bu kodu deneyin:

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

Parametreyi eksik başka bir gotcha oldu, bunu işaret ettiğiniz için teşekkürler.
crowebird

1
"ParametreLimit: 50000" eklenmesi sorunu çözer.
Andrien Pecson

1
Bu cevabı bulana kadar bu konuda çok zorlanıyordum. TEŞEKKÜR EDERİM! #Relieve
Stephan Celis

Tam da aradığım şey buydu!
ApplePie

Belirgin çözümle uğraşıyordum ama bu çok yardımcı oluyor.
Ahmed Khan

55

Birisi tüm yanıtları denedi, ancak henüz başarılı olamadıysa ve siteyi barındırmak için NGINX kullanıyorsa, bu satırı / etc / nginx / sites-available dizinine ekleyin

client_max_body_size 100M; #100mb

4
Bu benim sorunumdu, teşekkürler! Bir ipucu, nginx'in varsayılan değeri 1MB'dir, bu nedenle bu miktarla sınırlı görünüyorsanız, muhtemelen nginx'tir. Ayrıca, başka bir ipucu: body-parser dönecektir bir limitmülk ve bir length(birlikte hata nesnesindeki özelliği status:413). Nginx bunu yapmaz. Bu nedenle, hata nesnesinde bu özellikleri göremiyorsanız, büyük olasılıkla bir nginx sınırıdır. İşte (büyük olasılıkla config dosyalarını bu nginx ayarın nasıl değiştirileceğini /etc/nginx/sites-available/)

2
Bu cevap için çok teşekkür ederim, bu cevabın kaldırılması gerektiğine inanıyorum çünkü önemli, kişisel olarak nginx yapılandırmasını unuttum ... yine büyük teşekkür ederim
Fadi Abo Msalam

Sadece ekspres olarak limit nasıl ayarlanır?
аlex dykyі

@ аlexdykyі Vivek22 kullanıcısının yanıtı: app.use (bodyParser ({limit: '50mb'}));
Alexander

bu bir sorundu! teşekkür ederim!
Victor

31

Bunun hızlı küresel boyut sınırı olduğunu düşünmüyorum, ancak özellikle connect.json ara katman sınırıdır . Bu, express.bodyParser()bir limitseçenek kullandığınızda varsayılan olarak 100 kb'dir .

Deneyin:

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

1
Merhaba - Aşağıdakileri kullanıyorum: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Hala aynı hatayı alıyorum ...
mike james

varsayılan sınır 100kbayttır,
Qiong Wu

15

benim durumumda .. ayarı parameterLimit:50000sorunu çözdü

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

Bu benim için çalıştı. "İstek varlığı çok büyük" de büyük dizelere (JSON gibi) gönderme yapıyor. ~ 20Kib JSON gönderiyorum ve bu sorun vardı (varsayılan body-parseryük boyutu sınırı benim için Tamam olduğunu unutmayın ). parameterLimitSadece (herhangi bir limits ayarlamak gerek) ile çözüldü .
aesede

13

2016, üstyapıcı için 'limite' ek olarak 'açık' ayarlayana kadar yukarıdakilerin hiçbiri benim için çalışmadı, örnek:

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

Evet, yapmam gereken de buydu. Ayrıca, yapılandırma ayarlarını uygulama komut dosyanızdan sürdürebilmeniz için ayarlandı.
Robb Sadler

3
bunu mu demek istediniz application/x-www-form-urlencoded(yerine application/x-www-form-urlencoding)?
el bombası

12

Aşağıdakiler benim için çalıştı ... Sadece kullan

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

bu kadar.

Her şeyi denedim ve hiçbiri işe yaramadı. Aşağıdaki gibi kullandığımız halde,

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

yalnızca app.use(bodyParser());birincisi tanımlanır ve son iki satır göz ardı edilir.

Bakınız: https://github.com/expressjs/body-parser/issues/176 >> bkz. 'Dougwilson 17 Haziran 2016 tarihinde yorum yaptı'


1
TEŞEKKÜR EDERİM! Ayrıca eski bir app.use (bodyParser.json ()) vardı; kodumdan önce ve gerçekten, sadece ilk kod alınır!
Nico

9

Ekspres ~ 4.16.0 için, express.json ile limit doğrudan çalışır

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

7

Benim durumumda sorun Nginx konfigürasyonundaydı . Bunu çözmek için dosyayı düzenlemek zorundayım /etc/nginx/nginx.confve bu satırı sunucu bloğu içine eklemeliyim:

client_max_body_size 5M;

Nginx'i yeniden başlatın ve sorunları gitti

sudo systemctl restart nginx

5

Multer dependancie ile bu sorun için başka bir uygulama kullandım.

Misal:

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

Küçük eski yazı ama aynı sorun vardı

Express 4. + kodumu kullanmak şöyle görünür ve iki günlük kapsamlı testlerden sonra harika çalışır.

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

Biraz farklı bir yaklaşım - taşıma kapasitesi çok BÜYÜK

Şimdiye kadar olan tüm yararlı cevaplar, yük sınırını artırmakla ilgilidir. Ancak, yükün gerçekten çok büyük olduğu, ancak iyi bir nedeni olmadığı da olabilir. Bunun geçerli bir nedeni yoksa, neden bu kadar şişkin olduğunu araştırmayı düşünün.

Kendi deneyimimiz

Örneğin, bizim durumumuzda, bir Açısal uygulama iş yükü içinde tüm nesneyi iştahla gönderiyordu. Şişirilmiş ve fazlalık bir özellik kaldırıldığında, yük boyutu 100 kat azaltıldı . Bu, performansı önemli ölçüde geliştirdi ve 413 hatasını çözdü.


4

Birçok denemeden sonra çözümümü aldım

Bu satıra yorum yaptım

app.use(bodyParser.json());

ve ben koydum

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

Sonra işe yarıyor


3

snippet'i takip etmek benim için sorunu çözdü.

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

2

Daha iyi bir kullanım, verilen satırlarda gösterildiği gibi dosya boyutunuzun sınırını belirleyebilirsiniz:

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

Varsayılan modülleri düğüm modülleri body-parser öğesinde ve sonra lib klasöründe de değiştirebilirsiniz, JSON ve metin dosyası vardır. O zaman burada sınırı değiştirin. Aslında, verilen parametre app.use (bodyParser.json ({limit: '10mb', uzatılmış: true})) limit parametresini geçmezseniz bu koşul geçer.


1

Ben de bu sorunla karşılaştım, app.use(bodyParser.json())aşağıdaki gibi tekrarlayarak aptalca bir hata yapıyordum :

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

kaldırarak app.use(bodyParser.json())sorunu çözdü.


1

Benim durumumda Content-typeistek başlıklarından kaldırma çalıştı.


0

Benim için ana hile

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

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

bodyParse.json ilk bodyParse.urlencocode ikinci


0

express.json()Ve bodyParser'ı birlikte kullanıyorsanız , express kendi sınırını belirlediği için hata verecektir.

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

yukarıdaki kodu kaldırın ve sadece aşağıdaki kodu ekleyin

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

tomislav-stankovic @ formatlama için teşekkürler
NIKIT PULEKAR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.