Błąd: żądanie elementu jest zbyt duże

469

Otrzymuję następujący błąd z 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

Używam podstępu. Mam następujące instrukcje użycia w pliku express.js

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

W skrzypaczu widzę nagłówek o długości treści o wartości: 1078702

Wierzę, że to jest w oktetach, to 1.0787 megabajtów.

Nie mam pojęcia, dlaczego express nie pozwala mi publikować tablicy json, którą wcześniej publikowałem w innym projekcie ekspresowym, który nie korzystał ze struktury projektu średniego stosu.

Mike James
źródło
5
szybka uwaga na ten temat dla każdego, kto przyjdzie na to pytanie - upewnij się, że Twoim problemem jest serwer węzła lub analizator treści. Na przykład używam poprawnie parsera treści, ale dostałem ten błąd, ponieważ ustawiłem maksymalny rozmiar ciała w pliku conf NGINX.
Stephen Tetreault,
@StephenTetreault Myślę, że powinieneś dodać to jako odpowiedź, chociaż oczywiście nie będzie to dotyczyło wszystkich, dokładnie tak się działo ze mną, kudzio.
Dado

Odpowiedzi:

990

Miałem ostatnio ten sam błąd i wszystkie znalezione przeze mnie rozwiązania nie zadziałały.

Po pewnym kopaniu stwierdziłem, że ustawienie app.use(express.bodyParser({limit: '50mb'}));prawidłowo ustawiło limit.

Podczas dodawania console.log('Limit file size: '+limit);w node_modules/express/node_modules/connect/lib/middleware/json.js:46i ponownym węzeł, otrzymuję ten wyjścia w konsoli:

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

Widzimy, że na początku, podczas ładowania connectmodułu, limit jest ustawiony na 1 MB (1048576 bajtów). Następnie, kiedy ustawiam limit, console.logwywoływane jest ponownie i tym razem limit wynosi 52428800 (50mb). Jednak nadal dostaję 413 Request entity too large.

Potem dodaje console.log('Limit file size: '+limit);się node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10i zobaczył kolejną linię w konsoli podczas wywoływania trasę z dużym życzenie (przed wyjściem błędu):

Limit file size: 1048576

Oznacza to, że gdzieś connectresetuje parametr limit i ignoruje to, co podaliśmy. Próbowałem określić bodyParserparametry w definicji trasy indywidualnie, ale też nie miałem szczęścia.

Chociaż nie znalazłem żadnego odpowiedniego sposobu, aby ustawić go na stałe, możesz „ załatać ” go bezpośrednio w module. Jeśli korzystasz z Express 3.4.4, dodaj to w wierszu 46 node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Numer linii może się różnić, jeśli nie uruchomisz tej samej wersji Express. Należy pamiętać, że jest to zła praktyka i będzie nadpisane jeśli zaktualizować moduł.

Więc to tymczasowe rozwiązanie działa na razie, ale jak tylko zostanie znalezione rozwiązanie (lub moduł naprawiony, jeśli jest to problem z modułem), powinieneś odpowiednio zaktualizować swój kod.

Otworzyłem problem na ich GitHubie na ten temat.

[edytuj - znalazł rozwiązanie]

Po kilku badaniach i testach odkryłem, że podczas debugowania dodałem app.use(express.bodyParser({limit: '50mb'}));, ale później app.use(express.json()); . Express ustawiłby wówczas globalny limit na 1 MB, ponieważ był to pierwszy analizator składni, który napotkał podczas uruchamiania skryptu express.json(). Poruszanie się bodyParsernad tym pomogło.

To powiedziawszy, bodyParser()metoda będzie przestarzała w Connect 3.0 i nie powinna być używana. Zamiast tego powinieneś jawnie zadeklarować swoje parsery:

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

Jeśli potrzebujesz wieloczęściowego (do przesyłania plików), zobacz ten post .

[druga edycja]

Zauważ, że w Express 4 zamiast express.json()i express.urlencoded(), musisz wymagać modułu parsera ciała i używać jego metod json()i urlencoded()metod, takich jak:

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

Jeśli extendedopcja nie jest wyraźnie zdefiniowana bodyParser.urlencoded(), wygeneruje ostrzeżenie ( body-parser deprecated undefined extended: provide extended option). Wynika to z faktu, że ta opcja będzie wymagana w następnej wersji i nie będzie już opcjonalna. Aby uzyskać więcej informacji na temat tej extendedopcji, można zapoznać się z readme z body-parser.

[trzecia edycja]

Wydaje się, że w Express v4.16.0 i później możemy wrócić do początkowego sposobu zrobienia tego (dzięki @GBMan za wskazówkę):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
źródło
7
Mój problem polegał na tym, że miałem parser express.json () nad moim bodyParser ... Po zrozumieniu, jak to wszystko działa, usunąłem bodyParser i ustawiłem de limit w drugim, jak app.use(express.json({limit:'50mb'}));. Zredagowałem swoją odpowiedź, aby to odzwierciedlić!
Samuel Bolduc
2
dla ekspresu 4 wskazany kod wyrzuca „parser body przestarzały niezdefiniowany rozszerzony: zapewnia opcję rozszerzoną” podczas urlencodedpołączenia
Mike „Pomax” Kamermans
3
Dziękujemy za zaktualizowanie tego do ekspresu 4. Jesteś ratownikiem!
Swills
36
Jest to tak wyczerpujące, jak tylko ta odpowiedź, więc jest jeszcze jeden punkt do przyszłego odniesienia, na które natknąłem się, jeśli używasz nginx jako odwrotnego proxy przed instancją node.js / express, co jest również zalecaną praktyką. Nginx zgłosi ten sam 413::Request Entity is too largewyjątek. Nie przekaże żądania do Twojej aplikacji ekspresowej. Musimy więc ustawić client_max_body_size 50M;w konfiguracji nginx LUB określoną konfigurację serwera LUB nawet określony znacznik lokalizacji będzie działał.
Aukhan
3
Dziękuję Samuelowi za to! Uratował mnie przed światem bólu głowy, okrzyków i +1 za kompleksową odpowiedź!
BastianBuhrkall
117

Używam Express 4.

W moim przypadku nie wystarczyło dodać następujące wiersze:

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

Próbowałem dodać opcję parametrLimit do funkcji urlencoded, ponieważ dokumentacja mówi, a błąd już się nie pojawia.

Opcja parameterLimit kontroluje maksymalną liczbę parametrów dozwolonych w danych zakodowanych w adresie URL. Jeśli żądanie zawiera więcej parametrów niż ta wartość, 413 zostanie zwrócone do klienta. Domyślnie 1000.

Spróbuj użyć tego kodu:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
slorenzo
źródło
ParametrLimit był kolejnym problemem, którego mi brakowało, dziękuję za zwrócenie na to uwagi.
crowebird 19.04.16
1
Dodanie „parameterLimit: 50000” rozwiązuje problem.
Andrien Pecson,
1
Walczyłem tak mocno, dopóki nie znalazłem tej odpowiedzi. DZIĘKUJĘ CI! #Relieve
Stephan Celis
Właśnie tego szukałem!
ApplePie,
Walczyłem z zaznaczonym rozwiązaniem, ale to bardzo pomaga.
Ahmed Khan,
55

Jeśli ktoś wypróbował wszystkie odpowiedzi, ale nie odniósł jeszcze sukcesu i używa NGINX do hostowania strony, dodaj tę linię do / etc / nginx / sites-available

client_max_body_size 100M; #100mb
Alexander
źródło
4
To był mój problem, dzięki! Jednym ze wskazówek jest to, że domyślnie nginx wynosi 1 MB, więc jeśli wydajesz się być ograniczony do tej kwoty, to prawdopodobnie jest to nginx. Również inna wskazówka: body-parser powróci do limitwłasności i lengthmienia w obiekcie błędu (wraz z status:413). Nginx tego nie robi. Jeśli więc nie widzisz tych właściwości w obiekcie błędu, prawdopodobnie jest to limit nginx. Oto jak zmienić to ustawienie Nginx (pliki konfiguracyjne najprawdopodobniej w /etc/nginx/sites-available/)
2
bardzo dziękuję za tę odpowiedź. Uważam, że należy odpowiedzieć pozytywnie, ponieważ jest ważna, osobiście zapomniałem o konfiguracji nginx ... znowu wielkie dziękuję
Fadi Abo Msalam
Jak ustawić limit tylko w trybie ekspresowym?
аlex dykyі
@ аlexdykyі Odpowiedź od Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
to był problem! Dziękuję Ci!
Victor
31

Nie sądzę, że jest to wyraźny globalny limit wielkości, ale konkretnie limit oprogramowania pośredniego connect.json . Jest to domyślnie 100 kb, gdy używasz express.bodyParser()i nie zapewniasz limitopcji.

Próbować:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
źródło
1
Cześć - Korzystam z następujących aplikacji: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Nadal otrzymuję ten sam błąd ...
Mike James,
domyślny limit to 100 kilobajtów, jak się wydaje, teraz github.com/expressjs/body-parser#limit
Qiong Wu
15

w moim przypadku .. ustawienie parameterLimit:50000naprawiło problem

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
źródło
To zadziałało dla mnie. Wydaje się, że „Żądanie zbyt duże” odnosi się również do dużych ciągów znaków (takich jak JSON). Publikowałem ~ 20 Kib JSON i miałem ten problem (zauważ, że domyślny limit wielkościbody-parser ładunku jest dla mnie OK). Zostało rozwiązane tylko (nie trzeba ustawiać żadnych s). parameterLimitlimit
aesede
13

2016, żadne z powyższych nie działało dla mnie, dopóki I Explicity nie ustawił „typu” oprócz „limitu” dla bodyparsera, przykład:

  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);
użytkownik1709076
źródło
Tak, właśnie to musiałem zrobić. Zostało tak skonfigurowane, że możesz sterować ustawieniami konfiguracji ze skryptu aplikacji.
Robb Sadler
3
Miałeś na myśli application/x-www-form-urlencoded (a nie application/x-www-form-urlencoding)?
granat
12

Poniższe działało dla mnie ... Wystarczy użyć

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

Otóż ​​to.

Próbowałem wszystkiego powyżej i żaden nie działał. Stwierdziliśmy, że mimo że używamy w następujący sposób,

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

tylko pierwszy app.use(bodyParser());definiowana jest a dwie ostatnie linie zostały zignorowane.

Patrz: https://github.com/expressjs/body-parser/issues/176 >> patrz „skomentował dougwilson 17 czerwca 2016 r.”

Vivek22
źródło
1
DZIĘKUJĘ CI! Miałem też stary app.use (bodyParser.json ()); w moim kodzie wcześniej i rzeczywiście, tylko pierwszy jest brany!
Nico,
8

W przypadku express ~ 4.16.0, express.json z limitem działa bezpośrednio

app.use(express.json({limit: '50mb'}));
Stenal P. Jolly
źródło
6

W moim przypadku problem dotyczył konfiguracji Nginx . Aby go rozwiązać, muszę edytować plik: /etc/nginx/nginx.confi dodać ten wiersz do bloku serwera:

client_max_body_size 5M;

Uruchom ponownie Nginx i problemy zniknęły

sudo systemctl restart nginx
Jaime Fernandez
źródło
5

Użyłem innej praktyki dla tego problemu z wieloma zależnościami.

Przykład:

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
źródło
5

Trochę stary post, ale miałem ten sam problem

Używając express 4. + mój kod wygląda tak i działa świetnie po dwóch dniach intensywnych testów.

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
źródło
4

Nieco inne podejście - ładowność jest zbyt DUŻA

Wszystkie dotychczasowe pomocne odpowiedzi dotyczą zwiększenia limitu ładowności. Ale może się zdarzyć, że ładowność jest rzeczywiście zbyt duża, ale bez uzasadnionego powodu. Jeśli nie ma żadnego uzasadnionego powodu, zastanów się, dlaczego jest tak wzdęty.

Nasze własne doświadczenie

Na przykład w naszym przypadku aplikacja Angular łapczywie wysyła cały obiekt do ładunku. Gdy jedna nadęta i zbędna właściwość została usunięta, rozmiar ładunku zmniejszono o współczynnik 100 . To znacznie poprawiło wydajność i rozwiązało błąd 413.

Boaz - Przywróć Monikę
źródło
4

Po wielu próbach mam rozwiązanie

Skomentowałem ten wiersz

app.use(bodyParser.json());

i położyłem

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

To działa

Maulik Patel
źródło
3

dla mnie następujący fragment rozwiązał problem.

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'})); 
Sanjeeva Kumar Acham
źródło
2

Im lepiej wykorzystać limit rozmiaru pliku, jak pokazano w podanych wierszach:

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

Możesz także zmienić ustawienie domyślne w parserze body-parser modułów-węzłów, a następnie w folderze lib znajduje się JSON i plik tekstowy. Następnie zmień limit tutaj. Właściwie ten warunek jest spełniony, jeśli nie podasz parametru limit w podanej linii app.use (bodyParser.json ({limit: '10mb', Extended: true})).

Ravi Beniwal
źródło
1

Ja również zmierzyłem się z tym problemem, popełniłem głupi błąd, powtarzając app.use(bodyParser.json())poniższe:

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

przez usunięcie app.use(bodyParser.json())rozwiązał problem.

WasiF
źródło
1

W moim przypadku Content-typedziałało usuwanie nagłówków z żądania.

carkod
źródło
0

Dla mnie główna sztuczka to

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

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

bodyParse.json pierwszy bodyParse.urlencoded drugi

Nicollas
źródło
0

Jeśli używasz express.json()i bodyParser razem, to da błąd, ponieważ express ustawia własny limit.

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

usuń powyższy kod i po prostu dodaj poniższy kod

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
NIKIT PULEKAR
źródło
dzięki za formatowanie @ tomislav-
stankovic