Kesalahan: entitas permintaan terlalu besar

473

Saya menerima kesalahan berikut dengan 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

Saya menggunakan meanstack. Saya memiliki pernyataan penggunaan berikut di express.js saya

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

Di dalam fiddler saya bisa melihat header panjang konten dengan nilai: 1078702

Saya percaya ini dalam oktet, ini adalah 1,0787 megabita.

Saya tidak tahu mengapa express tidak membiarkan saya memposting json array yang saya posting sebelumnya di proyek express lain yang tidak menggunakan struktur stack proyek rata-rata.

mike james
sumber
5
catatan cepat tentang hal ini kepada siapa saja yang datang ke pertanyaan ini - pastikan masalah Anda sebenarnya adalah server node atau pengurai tubuh. Misalnya saya menggunakan body parser dengan benar tetapi saya mendapatkan kesalahan ini karena saya untuk mengatur ukuran tubuh maks dalam file conf NGINX.
Stephen Tetreault
@StephenTetreault Saya pikir Anda harus menambahkan itu sebagai jawaban, sementara tentu saja itu tidak berlaku untuk semua orang, itu persis apa yang terjadi pada saya, kudos.
Dado

Jawaban:

995

Saya memiliki kesalahan yang sama baru-baru ini, dan semua solusi yang saya temukan tidak berfungsi.

Setelah beberapa penggalian, saya menemukan bahwa pengaturan app.use(express.bodyParser({limit: '50mb'}));memang menetapkan batas dengan benar.

Saat menambahkan simpul console.log('Limit file size: '+limit);masuk node_modules/express/node_modules/connect/lib/middleware/json.js:46dan mulai ulang, saya mendapatkan keluaran ini di konsol:

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

Kita dapat melihat bahwa pada awalnya, ketika memuat connectmodul, batasnya diatur ke 1mb (1048576 bytes). Kemudian ketika saya menetapkan batas, console.logdipanggil lagi dan kali ini batasnya adalah 52428800 (50mb). Namun, saya masih mendapatkan 413 Request entity too large.

Lalu aku menambahkan console.log('Limit file size: '+limit);dalam node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10dan melihat garis lain di konsol saat memanggil rute dengan permintaan yang besar (sebelum output error):

Limit file size: 1048576

Ini berarti bahwa entah bagaimana, di suatu tempat, connectmengatur ulang parameter batas dan mengabaikan apa yang kami tentukan. Saya mencoba menentukan bodyParserparameter dalam definisi rute secara individual, tetapi tidak berhasil juga.

Meskipun saya tidak menemukan cara yang tepat untuk mengaturnya secara permanen, Anda dapat " menambal " itu dalam modul secara langsung. Jika Anda menggunakan Express 3.4.4, tambahkan ini pada baris 46 dari node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Nomor baris mungkin berbeda jika Anda tidak menjalankan versi Express yang sama. Harap dicatat bahwa ini adalah praktik buruk dan akan ditimpa jika Anda memperbarui modul Anda.

Jadi solusi sementara ini berfungsi untuk saat ini, tetapi segera setelah solusi ditemukan (atau modul diperbaiki, jika itu masalah modul) Anda harus memperbarui kode Anda sesuai.

Saya telah membuka masalah pada GitHub mereka tentang masalah ini.

[sunting - menemukan solusinya]

Setelah beberapa penelitian dan pengujian, saya menemukan bahwa ketika debugging, saya menambahkan app.use(express.bodyParser({limit: '50mb'}));, tetapi setelah app.use(express.json()); . Express kemudian akan menetapkan batas global menjadi 1mb karena parser pertama yang ia temui saat menjalankan skrip express.json(). Bergerak di bodyParseratas itu berhasil.

Karena itu, bodyParser()metode ini akan usang di Connect 3.0 dan tidak boleh digunakan. Sebagai gantinya, Anda harus mendeklarasikan parser Anda secara eksplisit, seperti:

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

Jika Anda membutuhkan multipart (untuk unggah file) lihat posting ini .

[edit kedua]

Perhatikan bahwa dalam Express 4, alih-alih express.json()dan express.urlencoded(), Anda harus memerlukan modul body-parser dan menggunakan metode json()dan caranya urlencoded(), seperti:

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

Jika extendedopsi tidak didefinisikan secara eksplisit untuk bodyParser.urlencoded(), itu akan memunculkan peringatan ( body-parser deprecated undefined extended: provide extended option). Ini karena opsi ini akan diperlukan di versi berikutnya dan tidak akan menjadi opsional lagi. Untuk info lebih lanjut tentang extendedopsi ini, Anda dapat merujuk ke readme of body-parser.

[sunting ketiga]

Tampaknya dalam Express v4.16.0 dan seterusnya, kita dapat kembali ke cara awal untuk melakukan ini (terima kasih kepada @GBMan untuk tipnya):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
sumber
7
Masalah saya adalah bahwa saya memiliki express.json () parser di atas bodyParser saya ... Setelah memahami cara kerjanya, saya menghapus bodyParser dan menetapkan batas de di yang lain, seperti app.use(express.json({limit:'50mb'}));. Saya mengedit jawaban saya untuk mencerminkan ini!
Samuel Bolduc
2
untuk express 4, kode yang ditunjukkan melempar "body-parser tidak lagi diperpanjang diperpanjang: menyediakan opsi diperpanjang" pada urlencodedpanggilan
Mike 'Pomax' Kamermans
3
Terima kasih telah memperbarui ini untuk express 4. Anda adalah penyelamat hidup!
Swills
36
Ini selengkap jawaban yang didapat, jadi ada satu poin lagi untuk referensi di masa depan yang saya temui jika Anda menggunakan nginx sebagai proxy terbalik di depan node.js / instance instan Anda, yang direkomendasikan untuk digunakan juga. Nginx akan melempar 413::Request Entity is too largepengecualian yang sama . Itu tidak akan meneruskan permintaan ke aplikasi ekspres Anda. Jadi kita perlu mengatur client_max_body_size 50M;konfigurasi nginx ATAU konfigurasi server tertentu ATAU bahkan tag lokasi tertentu akan berfungsi.
Aukhan
3
Terima kasih samuel untuk ini! Menyelamatkan saya dari dunia sakit kepala, Ceria, dan +1 untuk jawaban komprehensif!
BastianBuhrkall
118

Saya menggunakan Express 4.

Dalam kasus saya, menambahkan baris-baris ini tidak cukup:

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

Saya mencoba menambahkan opsi parameterLimit pada fungsi urlencoded sebagai dokumentasi mengatakan dan kesalahan tidak lagi muncul.

Opsi parameterLimit mengontrol jumlah maksimum parameter yang diizinkan dalam data yang disandikan URL. Jika permintaan mengandung lebih banyak parameter dari nilai ini, 413 akan dikembalikan ke klien. Default ke 1000.

Coba dengan kode ini:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
slorenzo
sumber
ParameterLimit adalah gotcha lain yang saya lewatkan, terima kasih telah menunjukkan ini.
crowebird
1
Menambahkan "parameterLimit: 50000" memecahkan masalah.
Andrien Pecson
1
Saya berjuang sangat keras dalam hal ini sampai saya menemukan jawaban ini. TERIMA KASIH! #Relieve
Stephan Celis
Ini persis apa yang saya cari!
ApplePie
Saya sedang berjuang dengan solusi yang ditandai tetapi ini banyak membantu.
Ahmed Khan
55

Jika seseorang mencoba semua jawaban, tetapi belum berhasil dan menggunakan NGINX untuk meng-host situs tambahkan baris ini ke / etc / nginx / sites-available

client_max_body_size 100M; #100mb
Alexander
sumber
4
Ini masalah saya, terima kasih! Satu petunjuk adalah bahwa standar nginx adalah 1MB, jadi jika Anda tampaknya terbatas pada jumlah itu maka mungkin nginx. Juga, petunjuk lain: body-parser akan kembali suatu limitproperti dan lengthproperti di objek error (bersama dengan status:413). Nginx tidak melakukan ini. Jadi jika Anda tidak dapat melihat properti itu di objek kesalahan, itu mungkin batas nginx. Inilah cara mengubah pengaturan nginx ini (kemungkinan besar file konfigurasi /etc/nginx/sites-available/)
2
terima kasih banyak atas jawaban ini saya percaya jawaban ini harus ditingkatkan karena penting, secara pribadi saya lupa tentang konfigurasi nginx ... sekali lagi besar terima kasih
Fadi Abo Msalam
Bagaimana cara menetapkan batas hanya dalam ekspres?
Axx dykyі
@ аlexdykyі Jawaban dari Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
ini masalah! Terima kasih!
Victor
31

Saya tidak berpikir ini adalah batas ukuran global express, tetapi khususnya batas middleware connect.json . Ini 100kb secara default saat Anda menggunakan express.bodyParser()dan tidak memberikan limitopsi.

Mencoba:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
sumber
1
Hai - Saya menggunakan yang berikut ini: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Saya masih menerima kesalahan yang sama ...
mike james
batas default adalah 100kbyte seperti yang terlihat sekarang github.com/expressjs/body-parser#limit
Qiong Wu
15

dalam kasus saya .. pengaturan parameterLimit:50000memperbaiki masalah

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
sumber
Ini berhasil untuk saya. "Permintaan entitas terlalu besar" tampaknya merujuk ke string besar (seperti JSON) juga. Saya memposting ~ 20Kib JSON dan mengalami masalah ini (perhatikan bahwa batas ukuranbody-parser payload default tidak masalah bagi saya). Dipecahkan hanya dengan (tidak perlu mengatur s). parameterLimitlimit
Aesede
13

2016, tidak satu pun di atas bekerja untuk saya sampai saya explicity mengatur 'tipe' selain 'batas' untuk bodyparser, contoh:

  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);
pengguna1709076
sumber
Ya, ini yang perlu saya lakukan juga. Dan itu sudah diatur sehingga Anda bisa menggerakkan pengaturan konfigurasi dari skrip aplikasi Anda.
Robb Sadler
3
Apakah maksud Anda application/x-www-form-urlencoded(bukan application/x-www-form-urlencoding)?
granat
12

Berikut ini bekerja untuk saya ... Cukup gunakan

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

itu dia.

Sudah mencoba semuanya dan tidak ada yang berhasil. Menemukan bahwa meskipun kami menggunakan seperti berikut ini,

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

hanya yang pertama yang app.use(bodyParser());didefinisikan dan dua baris terakhir diabaikan.

Lihat: https://github.com/expressjs/body-parser/issues/176 >> see 'dougwilson berkomentar pada 17 Juni 2016'

Vivek22
sumber
1
TERIMA KASIH! Saya juga punya app.use lama (bodyParser.json ()); dalam kode saya sebelum dan memang, hanya yang pertama diambil!
Nico
8

Untuk express ~ 4.16.0, express.json dengan limit bekerja secara langsung

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

Dalam kasus saya masalahnya ada pada konfigurasi Nginx . Untuk mengatasinya saya harus mengedit file: /etc/nginx/nginx.confdan menambahkan baris ini di dalam blok server:

client_max_body_size 5M;

Mulai ulang Nginx dan masalah itu hilang

sudo systemctl restart nginx
Jaime Fernandez
sumber
5

Saya telah menggunakan praktik lain untuk masalah ini dengan multer dependancie.

Contoh:

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

Posting lama tapi saya punya masalah yang sama

Menggunakan express 4. + kode saya terlihat seperti ini dan berfungsi dengan baik setelah dua hari pengujian ekstensif.

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

Pendekatan yang sedikit berbeda - payloadnya terlalu BESAR

Semua jawaban yang bermanfaat sejauh ini berhubungan dengan meningkatkan batas muatan. Tetapi mungkin juga kasusnya bahwa muatannya memang terlalu besar tetapi tanpa alasan. Jika tidak ada alasan yang masuk akal untuk itu, pertimbangkan untuk mencari tahu mengapa itu begitu membengkak.

Pengalaman kita sendiri

Misalnya, dalam kasus kami, aplikasi Angular dengan rakus mengirim seluruh objek dalam muatan. Ketika satu properti yang membengkak dan berlebihan dihilangkan, ukuran muatan dikurangi sebesar faktor 100 . Ini secara signifikan meningkatkan kinerja dan menyelesaikan kesalahan 413.

Boaz - Pasang kembali Monica
sumber
4

Setelah ד o banyak percobaan saya mendapat solusi

Saya telah berkomentar di baris ini

app.use(bodyParser.json());

dan saya taruh

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

Lalu berhasil

Maulik Patel
sumber
3

bagi saya potongan berikut memecahkan masalah.

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

Penggunaan yang lebih baik Anda dapat menentukan batas ukuran file Anda seperti yang ditunjukkan pada baris yang diberikan:

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

Anda juga dapat mengubah pengaturan default di node-modules body-parser kemudian di folder lib, ada JSON dan file teks. Kemudian ubah batas di sini. Sebenarnya, kondisi ini akan berlalu jika Anda tidak melewati parameter batas di baris app.use (bodyParser.json ({limit: '10mb', extended: true})).

Ravi Beniwal
sumber
1

Saya juga menghadapi masalah itu, saya membuat kesalahan konyol dengan mengulangi app.use(bodyParser.json())seperti di bawah ini:

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

dengan menghapus app.use(bodyParser.json()), memecahkan masalah.

WasiF
sumber
1

Dalam kasus saya menghapus Content-typedari header permintaan berhasil.

carkod
sumber
0

Bagi saya trik utamanya adalah

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

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

bodyParse.json first bodyParse.urlencoded kedua

Nicolla
sumber
0

Jika Anda menggunakan express.json()dan bodyParser bersama-sama itu akan memberikan kesalahan karena express menetapkan batasnya sendiri.

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

hapus kode di atas dan tambahkan saja kode di bawah ini

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
NIKIT PULEKAR
sumber
terima kasih telah memformat @ tomislav-stankovic
NIKIT PULEKAR