783 Stimmen

Fehler: Anforderungssatz zu groß

Ich erhalte den folgenden Fehler mit Express:

Fehler: Anforderungsentität zu groß
    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| 

Kann Eigenschaft 'host' von undefined nicht festlegen
    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

Ich verwende meanstack. Ich habe die folgenden Verwendungsanweisungen in meinem express.js

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

In Fiddler kann ich den Inhaltslängenheader mit einem Wert von: 1078702 sehen

Ich glaube, dies sind Oktette, das sind 1,0787 Megabyte.

Ich habe keine Ahnung, warum Express mich nicht den JSON-Array posten lässt, den ich zuvor in einem anderen Express-Projekt gepostet hatte, das nicht die Projektstruktur des Mean-Stack verwendet hat.

1521voto

Samuel Bolduc Punkte 17503

Ich hatte vor kurzem denselben Fehler, und alle Lösungen, die ich ausprobiert habe, haben nicht funktioniert.

Nach einigem Suchen fand ich heraus, dass das Setzen von app.use(express.bodyParser({limit: '50mb'})); tatsächlich das Limit korrekt gesetzt hat.

Als ich ein console.log('Limit Dateigröße: ' + limit); in node_modules/express/node_modules/connect/lib/middleware/json.js:46 hinzufügte und Node neu startete, erhielt ich folgende Ausgabe in der Konsole:

Limit Dateigröße: 1048576
connect.multipart() wird in connect 3.0 entfernt
Besuchen Sie https://github.com/senchalabs/connect/wiki/Connect-3.0 für Alternativen
connect.limit() wird in connect 3.0 entfernt
Limit Dateigröße: 52428800
Express Server hört auf Port 3002

Wir sehen, dass zuerst, beim Laden des connect Moduls, das Limit auf 1 MB (1048576 Bytes) gesetzt ist. Dann, als ich das Limit setzte, wurde das console.log erneut aufgerufen und diesmal betrug das Limit 52428800 (50 MB). Dennoch erhalte ich immer noch eine 413 Request Entity Too Large.

Dann fügte ich console.log('Limit Dateigröße: ' + limit); in node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10 hinzu und sah eine weitere Zeile in der Konsole beim Aufruf der Route mit einer großen Anfrage (vor der Fehlerausgabe):

Limit Dateigröße: 1048576

Dies bedeutet, dass auf irgendeine Weise connect den Grenzwertparameter zurücksetzt und ignoriert, was ich spezifiziert habe. Ich habe versucht, die bodyParser Parameter in der Routendefinition einzeln anzugeben, aber auch kein Glück.

Obwohl ich keinen richtigen Weg gefunden habe, um es dauerhaft einzustellen, können Sie es vorübergehend im Modul selbst "patchen". Wenn Sie Express 3.4.4 verwenden, fügen Sie dies in Zeile 46 von node_modules/express/node_modules/connect/lib/middleware/json.js hinzu:

limit = 52428800; // für 50 MB, entspricht der Größe in Bytes

Die Zeilennummer kann sich unterscheiden, wenn Sie nicht die gleiche Version von Express ausführen. Bitte beachten Sie, dass dies keine gute Praxis ist und überschrieben wird, wenn Sie Ihr Modul aktualisieren.

Daher funktioniert diese vorübergehende Lösung im Moment, aber sobald eine Lösung gefunden wird (oder das Modul behoben wird, falls es sich um ein Modulproblem handelt), sollten Sie Ihren Code entsprechend aktualisieren.

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

[Bearbeitung - Lösung gefunden]

Nach einigen Recherchen und Tests fand ich heraus, dass, als ich debuggte, app.use(express.bodyParser({limit: '50mb'})); hinzufügte, aber nach app.use(express.json());. Express würde dann das globale Limit auf 1 MB setzen, weil der erste Parser, den er beim Ausführen des Skripts traf, express.json() war. Das Verschieben von bodyParser darüber hat funktioniert.

Trotzdem wird die bodyParser() Methode in Connect 3.0 veraltet sein und sollte nicht mehr verwendet werden. Stattdessen sollten Sie Ihre Parser explizit deklarieren, wie folgt:

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

Falls Sie multipart benötigen (für Datei-Uploads), siehe diesen Beitrag.

[Zweite Bearbeitung]

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

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

Wenn die extended Option nicht explizit für bodyParser.urlencoded() definiert wurde, wird eine Warnung angezeigt (body-parser deprecated undefined extended: provide extended option). Dies liegt daran, dass diese Option in der nächsten Version erforderlich sein wird und nicht mehr optional sein wird. Für weitere Informationen zur extended Option können Sie sich an das body-parser Readme wenden.

[Dritte Bearbeitung]

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

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

182voto

saeta Punkte 3722

In meinem Fall hat es nicht ausgereicht, 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, das parameterLimit-Option auf der urlencoded-Funktion hinzuzufügen, wie es in der Dokumentation steht, und der Fehler erscheint nicht mehr.

Die parameterLimit-Option steuert die maximale Anzahl von Parametern, die in den URL-codierten Daten erlaubt sind. Wenn eine Anfrage mehr Parameter als diesen Wert enthält, wird eine 413 an den Client zurückgegeben. Standardmäßig sind es 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}));

74voto

Alexander Punkte 1494

Wenn jemand alle Antworten ausprobiert hat, aber bisher keinen Erfolg hatte und NGINX verwendet, um die Website zu hosten, fügen Sie diese Zeile in /etc/nginx/sites-available hinzu

client_max_body_size 100M; #100mb

45voto

Peter Lyons Punkte 137811

Ich glaube nicht, dass dies das ausdrückliche globale Größenlimit ist, sondern speziell das connect.json Middleware-Limit. Dies beträgt standardmäßig 1 MB, wenn Sie express.bodyParser() verwenden und keine limit-Option angeben.

Versuchen Sie es:

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

36voto

Stenal P Jolly Punkte 737

Für express ~4.16.0 funktioniert express.json mit Limit direkt

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X