Fehler: Anforderungsentität zu groß

471

Ich erhalte den folgenden Fehler mit 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

Ich benutze Meanstack. Ich habe die folgenden Verwendungsanweisungen in meiner express.js

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

In Fiddler kann ich den Content-Length-Header mit dem Wert: 1078702 sehen

Ich glaube, das ist in Oktetten, das sind 1.0787 Megabyte.

Ich habe keine Ahnung, warum Express es mir nicht erlaubt, das JSON-Array zu veröffentlichen, das ich zuvor in einem anderen Express-Projekt gepostet habe, das nicht die mittlere Stapelprojektstruktur verwendet hat.

Mike James
quelle
5
Kurzer Hinweis dazu an alle, die zu dieser Frage kommen - stellen Sie sicher, dass es sich bei Ihrem Problem tatsächlich um den Knotenserver oder den Body-Parser handelt. Zum Beispiel verwende ich den Body Parser korrekt, aber ich habe diesen Fehler erhalten, weil ich die maximale Body Size in der NGINX conf-Datei festlegen möchte.
Stephen Tetreault
@StephenTetreault Ich denke, Sie sollten das als Antwort hinzufügen, obwohl es natürlich nicht für alle gilt, war es genau das, was mir passiert ist, ein dickes Lob.
Dado

Antworten:

991

Ich hatte kürzlich den gleichen Fehler und alle Lösungen, die ich gefunden habe, haben nicht funktioniert.

Nach einigem Graben stellte ich fest, dass die Einstellung app.use(express.bodyParser({limit: '50mb'}));das Limit korrekt eingestellt hatte.

Wenn eine Zugabe console.log('Limit file size: '+limit);in node_modules/express/node_modules/connect/lib/middleware/json.js:46und Neustarten Knoten, ich diese Ausgabe in der Konsole:

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

Wir können sehen, dass beim Laden des connectModuls zunächst das Limit auf 1 MB (1048576 Byte) festgelegt wird. Wenn ich dann das Limit einstelle, console.logwird das erneut aufgerufen und dieses Mal ist das Limit 52428800 (50 MB). Ich bekomme aber immer noch eine 413 Request entity too large.

Dann habe ich console.log('Limit file size: '+limit);in node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10und sah eine weitere Zeile in der Konsole , wenn die Strecke mit einem großen Wunsch Aufruf (vor der Fehlerausgabe):

Limit file size: 1048576

Dies bedeutet, dass irgendwo irgendwo connectder Grenzwertparameter zurückgesetzt wird und ignoriert wird, was wir angegeben haben. Ich habe versucht, die bodyParserParameter in der Routendefinition einzeln anzugeben , aber auch kein Glück.

Ich habe zwar keinen geeigneten Weg gefunden, um es dauerhaft einzustellen, aber Sie können es direkt im Modul " patchen ". Wenn Sie Express 3.4.4 verwenden, fügen Sie dies in Zeile 46 von hinzu node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Die Zeilennummer kann abweichen, wenn Sie nicht dieselbe Express-Version ausführen. Bitte beachten Sie, dass dies eine schlechte Praxis ist und überschrieben wird, wenn Sie Ihr Modul aktualisieren.

Diese temporäre Lösung funktioniert also vorerst, aber sobald eine Lösung gefunden wurde (oder das Modul repariert wurde, falls es sich um ein Modulproblem handelt), sollten Sie Ihren Code entsprechend aktualisieren.

Ich habe auf ihrem GitHub ein Problem zu diesem Problem geöffnet .

[bearbeiten - die Lösung gefunden]

Nach einigen Recherchen und Tests stellte ich fest, dass ich beim Debuggen hinzugefügt habe app.use(express.bodyParser({limit: '50mb'}));, aber danach app.use(express.json()); . Express würde dann das globale Limit auf 1 MB festlegen, da der erste Parser, auf den er beim Ausführen des Skripts stieß, war express.json(). Sich bodyParserdarüber zu bewegen hat den Trick getan.

Die bodyParser()Methode ist jedoch in Connect 3.0 veraltet und sollte nicht verwendet werden. Stattdessen sollten Sie Ihre Parser explizit wie folgt deklarieren:

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

Falls Sie mehrteilige Dateien benötigen (zum Hochladen von Dateien), lesen Sie diesen Beitrag .

[zweite Bearbeitung]

Beachten Sie, dass Sie in Express 4 anstelle von express.json()und express.urlencoded()das Body-Parser- Modul benötigen und dessen json()und urlencoded()Methoden wie folgt verwenden müssen:

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

Wenn die extendedOption nicht explizit für definiert ist bodyParser.urlencoded(), wird eine Warnung ausgegeben ( body-parser deprecated undefined extended: provide extended option). Dies liegt daran, dass diese Option in der nächsten Version erforderlich ist und nicht mehr optional ist. Weitere Informationen zu dieser extendedOption finden Sie in der Readme-Datei von body-parser.

[dritte Bearbeitung]

Es scheint, dass wir ab Express v4.16.0 zum ursprünglichen Weg zurückkehren können (danke an @GBMan für den Tipp):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Samuel Bolduc
quelle
7
Mein Problem war, dass ich den parser express.json () über meinem bodyParser hatte ... Nachdem ich verstanden hatte, wie das alles funktioniert, entfernte ich bodyParser und setzte de limit im anderen, wie app.use(express.json({limit:'50mb'}));. Ich habe meine Antwort bearbeitet, um dies widerzuspiegeln!
Samuel Bolduc
2
Für Express 4 urlencoded
löst
3
Vielen Dank für die Aktualisierung für Express 4. Sie sind ein Lebensretter!
Swills
36
Dies ist so umfassend wie diese Antwort, daher gibt es noch einen weiteren Punkt für zukünftige Referenz, auf den ich gestoßen bin, wenn Sie nginx als Reverse-Proxy vor Ihrer node.js / express-Instanz verwenden, was ebenfalls empfohlen wird. Nginx wird die gleiche 413::Request Entity is too largeAusnahme auslösen . Die Anfrage wird nicht an Ihre Express-App weitergeleitet. Wir müssen also client_max_body_size 50M;in der Nginx-Konfiguration ODER eine bestimmte Serverkonfiguration festlegen ODER sogar ein bestimmtes Standort-Tag funktioniert.
Aukhan
3
Danke samuel dafür! Rettete mich vor einer Welt voller Kopfschmerzen, Prost und +1 für die umfassende Antwort!
BastianBuhrkall
117

Ich benutze Express 4.

In meinem Fall war es nicht genug, diese Zeilen hinzuzufügen:

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

Ich habe versucht, die Option parameterLimit für die urlencodierte Funktion hinzuzufügen, wie in der Dokumentation angegeben, und es wird kein Fehler mehr angezeigt.

Die Option parameterLimit steuert die maximale Anzahl von Parametern, die in den URL-codierten Daten zulässig sind. Wenn eine Anforderung mehr Parameter als diesen Wert enthält, wird ein 413 an den Client zurückgegeben. Der Standardwert ist 1000.

Versuchen Sie es mit diesem Code:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
Slorenzo
quelle
Das parameterLimit war ein weiteres Problem, das mir fehlte, danke, dass Sie darauf hingewiesen haben.
Crowebird
1
Das Hinzufügen des "parameterLimit: 50000" löst das Problem.
Andrien Pecson
1
Ich hatte so große Probleme damit, bis ich diese Antwort fand. VIELEN DANK! #Relieve
Stephan Celis
Genau das habe ich gesucht!
ApplePie
Ich hatte Probleme mit der markierten Lösung, aber das hilft sehr.
Ahmed Khan
55

Wenn jemand alle Antworten ausprobiert hat, aber noch keinen Erfolg hatte und NGINX zum Hosten der Site verwendet, fügen Sie diese Zeile zu / etc / nginx / sites-available hinzu

client_max_body_size 100M; #100mb
Alexander
quelle
4
Das war mein Problem, danke! Ein Hinweis ist, dass der Standardwert von Nginx 1 MB beträgt. Wenn Sie also auf diesen Betrag beschränkt zu sein scheinen, handelt es sich wahrscheinlich um Nginx. Ein weiterer Hinweis: body-parser Gibt eine limitEigenschaft und eine lengthEigenschaft im Fehlerobjekt zurück (zusammen mit status:413). Nginx macht das nicht. Wenn Sie diese Eigenschaften im Fehlerobjekt nicht sehen können, handelt es sich wahrscheinlich um ein Nginx-Limit. Hier ist, wie man diese Nginx-Einstellung ändert (Konfigurationsdateien höchstwahrscheinlich in /etc/nginx/sites-available/)
2
Vielen Dank für diese Antwort. Ich glaube, diese Antwort sollte positiv bewertet werden, da sie wichtig ist. Ich persönlich habe die Nginx-Konfiguration vergessen.
Nochmals ein
Wie setze ich Limit nur in Express?
Alex Dyky
@ аlexdykyі Antwort von Vivek22: app.use (bodyParser ({limit: '50mb'}));
Alexander
Das war ein Problem! Vielen Dank!
Victor
31

Ich denke nicht, dass dies die globale Größenbeschränkung ist, sondern speziell die Middleware-Beschränkung connect.json . Dies sind standardmäßig 100 KB, wenn Sie express.bodyParser()eine limitOption verwenden und diese nicht bereitstellen .

Versuchen:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Peter Lyons
quelle
1
Hallo, ich verwende Folgendes: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), tracks.all); Ich
erhalte
Das Standardlimit ist 100 KByte, wie es jetzt scheint. github.com/expressjs/body-parser#limit
Qiong Wu
15

in meinem Fall .. Einstellung parameterLimit:50000behoben das Problem

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Mohanad Obaid
quelle
Das hat bei mir funktioniert. "Anforderungsentität zu groß" scheint sich auch auf große Zeichenfolgen (wie JSON) zu beziehen. Ich war Entsendung ~ 20Kib JSON und hatte dieses Problem ( man beachte , dass Standard - Nutzlastgrößebody-parser Grenze OK für mich). Wurde nur mit gelöst (keine Notwendigkeit, s zu setzen ). parameterLimitlimit
Aesede
13

2016 hat nichts davon für mich funktioniert, bis ich explizit den 'Typ' zusätzlich zum 'Limit' für Bodyparser festgelegt habe, Beispiel:

  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
quelle
Ja, das musste ich auch tun. Und es wurde so eingerichtet, dass Sie die Konfigurationseinstellungen über Ihr App-Skript steuern können.
Robb Sadler
3
meintest du application/x-www-form-urlencoded(eher als application/x-www-form-urlencoding)?
Granate
12

Folgendes hat bei mir funktioniert ... Einfach benutzen

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

das ist es.

Versuchte alles oben und keiner hat funktioniert. Gefunden, dass, obwohl wir wie folgt verwenden,

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

nur der 1 .. app.use(bodyParser()); wird definiert und die letzten beiden Zeilen wurden ignoriert.

Siehe: https://github.com/expressjs/body-parser/issues/176 >> siehe 'dougwilson kommentiert am 17. Juni 2016'

Vivek22
quelle
1
VIELEN DANK! Ich hatte auch eine alte app.use (bodyParser.json ()); in meinem Code vorher und tatsächlich wird nur der erste genommen!
Nico
8

Für Express ~ 4.16.0 funktioniert express.json mit limit direkt

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

In meinem Fall lag das Problem in der Nginx-Konfiguration . Um es zu lösen, muss ich die Datei bearbeiten: /etc/nginx/nginx.confund diese Zeile innerhalb des Serverblocks hinzufügen:

client_max_body_size 5M;

Starten Sie Nginx neu und die Probleme sind weg

sudo systemctl restart nginx
Jaime Fernandez
quelle
5

Ich habe eine andere Praxis für dieses Problem mit Multer Dependancie angewendet.

Beispiel:

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

Kleine alte Post, aber ich hatte das gleiche Problem

Mit Express 4. + sieht mein Code so aus und funktioniert nach zwei Tagen intensiver Tests hervorragend.

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

Ein etwas anderer Ansatz - die Nutzlast ist zu groß

Alle bisher hilfreichen Antworten befassen sich mit der Erhöhung des Nutzlastlimits. Es kann aber auch vorkommen, dass die Nutzlast zwar zu groß ist, aber ohne guten Grund. Wenn es keinen triftigen Grund dafür gibt, überlegen Sie, warum es überhaupt so aufgebläht ist.

Unsere eigene Erfahrung

In unserem Fall hat beispielsweise eine Angular-App gierig ein ganzes Objekt in der Nutzlast gesendet. Wenn eine aufgeblähte und redundante Eigenschaft entfernt wurde, wurde die Nutzlastgröße um den Faktor 100 reduziert . Dies verbesserte die Leistung erheblich und löste den 413-Fehler.

Boaz - Monica wieder einsetzen
quelle
4

Nach vielen Versuchen bekam ich meine Lösung

Ich habe diese Zeile kommentiert

app.use(bodyParser.json());

und ich setze

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

Dann funktioniert es

Maulik Patel
quelle
3

Für mich löste das folgende Snippet das Problem.

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

Zur besseren Verwendung können Sie die Grenze Ihrer Dateigröße angeben, wie in den angegebenen Zeilen angegeben:

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

Sie können die Standardeinstellung auch im Body-Parser der Knotenmodule ändern. Im Ordner lib befinden sich JSON und eine Textdatei. Dann ändern Sie hier das Limit. Tatsächlich wird diese Bedingung erfüllt, wenn Sie den Parameter limit in der angegebenen Zeile app.use (bodyParser.json ({limit: '10mb', erweitert: true})) nicht übergeben.

Ravi Beniwal
quelle
1

Auch ich war mit diesem Problem konfrontiert. Ich habe einen dummen Fehler gemacht, indem ich app.use(bodyParser.json())Folgendes wiederholt habe :

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

durch Entfernen app.use(bodyParser.json())löste das Problem.

WasiF
quelle
1

In meinem Fall hat das Entfernen Content-typeaus den Anforderungsheadern funktioniert.

Carkod
quelle
0

Für mich ist der Haupttrick

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

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

bodyParse.json first bodyParse.urlencoded second

Nicollas
quelle
0

Wenn Sie express.json()und bodyParser zusammen verwenden, wird ein Fehler ausgegeben , da Express sein eigenes Limit festlegt.

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

Entfernen Sie den obigen Code und fügen Sie einfach den folgenden Code hinzu

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
NIKIT PULEKAR
quelle
danke für die Formatierung @ tomislav-stankovic
NIKIT PULEKAR