エラー:リクエストエンティティが大きすぎます


471

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

平均スタックを使用しています。私のexpress.jsに次の使用ステートメントがあります

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

フィドラー内で、値が1078702のcontent-lengthヘッダーを確認できます。

これはオクテット単位であると思います。これは1.0787メガバイトです。

平均スタックプロジェクト構造を使用していない別のエクスプレスプロジェクトで以前に投稿していたjson配列をエクスプレスが投稿できない理由がわかりません。


5
この質問に来たすべての人にこれについて簡単に注意してください-あなたの問題が実際にノードサーバーまたはボディパーサーであることを確認してください。たとえば、ボディパーサーを正しく使用していますが、NGINX confファイルで最大ボディサイズを設定するためにこのエラーが発生しました。
Stephen Tetreault 2017

@StephenTetreault私はあなたが答えとしてそれを追加すべきだと思います、もちろんそれは誰にでも当てはまるわけではありません、それは私に起こっていたものでした、功績。
Dado、

回答:


992

最近同じエラーが発生し、見つけたすべての解決策が機能しませんでした。

少し調べたところ、設定app.use(express.bodyParser({limit: '50mb'}));によって制限が正しく設定されたことがわかりました。

ノードを追加console.log('Limit file size: '+limit);node_modules/express/node_modules/connect/lib/middleware/json.js:46て再起動すると、コンソールに次の出力が表示されます。

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

最初に、connectモジュールをロードするときに、制限が1MB(1048576バイト)に設定されていることがわかります。次に、制限を設定すると、console.logが再度呼び出され、今回の制限は52428800(50mb)です。しかし、私はまだ得る413 Request entity too large

次に、大きなリクエストを使用してルートを呼び出すときに(エラー出力の前に)追加console.log('Limit file size: '+limit);node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10、コンソールに別の行を表示しました。

Limit file size: 1048576

これは、どういうわけか、どこかでconnectlimitパラメータをリセットし、指定したものを無視することを意味します。bodyParserルート定義のパラメーターを個別に指定してみましたが、うまくいきませんでした。

恒久的に設定する適切な方法は見つかりませんでしたが、モジュールに直接「パッチ」できます。Express 3.4.4を使用している場合は、node_modules/express/node_modules/connect/lib/middleware/json.js次の46行目に追加します。

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

同じバージョンのExpressを実行しないと、行番号が異なる場合があります。これは悪い習慣であり、モジュールを更新すると上書きされることに注意してください。

したがって、この一時的な解決策は今のところ機能しますが、解決策が見つかったら(またはモジュールの問題の場合はモジュールが修正されたら)、それに応じてコードを更新する必要があります。

私は開いている自分のGitHub上の問題をこの問題について。

[編集-解決策を見つけた]

いくつかの研究とテストの後、私はデバッグ時、私は追加ことがわかったapp.use(express.bodyParser({limit: '50mb'}));が、後に app.use(express.json());。その後、Expressは、スクリプトの実行時に最初に検出されたパーサーがだったため、グローバル制限を1MBに設定しexpress.json()ます。bodyParser上に移動するのがコツです。

bodyParser()とはいえ、このメソッドはConnect 3.0で廃止される予定なので、使用しないでください。代わりに、次のようにパーサーを明示的に宣言する必要があります。

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

マルチパート(ファイルのアップロード用)が必要な場合は、この投稿を参照してください。

[2番目の編集]

Express 4では、express.json()andの代わりにexpress.urlencoded()、次のようにbody-parserモジュールを必要とし、そのjson()and urlencoded()メソッドを使用する必要があることに注意してください。

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

extendedオプションがに対して明示的に定義されていない場合、bodyParser.urlencoded()警告(body-parser deprecated undefined extended: provide extended option)がスローされます。これは、このオプションが次のバージョンで必要になるため、オプションではなくなるためです。extendedオプションの詳細については、のreadmeを参照してくださいbody-parser

[第3編集]

Express v4.16.0以降では、これを行う最初の方法に戻ることができるようです(ヒントについては@GBManに感謝します)。

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

7
私の問題は、bodyParserの上にexpress.json()パーサーがあったことです...すべてがどのように機能するかを理解した後、bodyParserを削除し、他の制限を設定しましたapp.use(express.json({limit:'50mb'}));。私はこれを反映するように私の回答を編集しました!
Samuel Bolduc 2013年

2
Express 4の場合、指定されたコードは、urlencodedコールで「body-parser deprecated undefined extended:
Provide

3
これをExpress 4に更新していただきありがとうございます。あなたは命の恩人です!
Swills、2015年

36
これはこの回答が得るのと同じくらい包括的であるため、node.js / expressインスタンスの前でnginxをリバースプロキシとして使用している場合に遭遇する将来の参照のためのもう1つのポイントがあります。これも推奨されるプラクティスです。Nginxも同じ413::Request Entity is too large例外をスローします。リクエストをExpressアプリに転送しません。そのためclient_max_body_size 50M;、nginx設定または特定のサーバー設定で設定する必要があります。特定の場所タグでも機能します。
Aukhan

3
サミュエル、ありがとうございました!頭痛の種、乾杯、そして包括的な答えの+1の世界から私を救いました!
BastianBuhrkall 2016年

117

私はExpress 4を使用しています。

私の場合、これらの行を追加するだけでは不十分でした:

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

ドキュメントでエラーが表示されなくなったため、urlencoded関数にparameterLimitオプションを追加してみました。

parameterLimitオプションは、URLエンコードされたデータで許可されるパラメーターの最大数を制御します。リクエストにこの値よりも多くのパラメーターが含まれている場合、413がクライアントに返されます。デフォルトは1000です。

このコードで試してください:

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

これを指摘してくれてありがとうございます。
クロウドリ

1
「parameterLimit:50000」を追加すると、問題が解決します。
Andrien Pecson 2017

1
この答えが見つかるまで、私はこれにとても苦労していました。ありがとうございました!#リリーフ
ステファンセリス

これはまさに私が探していたものです!
ApplePie

マークされた解決策に苦労していましたが、これは非常に役立ちます。
Ahmed Khan、

55

誰かがすべての答えを試したがまだ成功しておらず、NGINXを使用してサイトをホストしている場合は、この行を/ etc / nginx / sites-availableに追加します

client_max_body_size 100M; #100mb

4
これは私の問題でした、ありがとう!1つの手がかりは、nginxのデフォルトが1MBであることです。したがって、その量に制限されているように思われる場合は、おそらくnginxです。また、別の手がかりは:body-parser 返されるlimitプロパティとlength(一緒にエラーオブジェクトのプロパティをstatus:413)。Nginxはこれを行いません。したがって、エラーオブジェクトでこれらのプロパティが表示されない場合、それはおそらくnginxの制限です。ここだ(最も可能性が高いのconfigファイルこのnginxの設定を変更する方法/etc/nginx/sites-available/

2
この回答はどうもありがとうございます。この回答は重要なので、投票する必要があると思います。個人的にはnginxの設定を忘れて
しまい

エクスプレスのみで制限を設定する方法は?
アレックスdykyі18年

@аlexdykyіVivek22からの回答:app.use(bodyParser({limit: '50mb'}));
アレクサンダー

これは問題でした!ありがとうございました!
ビクター

31

これはエクスプレスグローバルサイズの制限ではないと思いますが、具体的にはconnect.jsonミドルウェアの制限です。オプションを使用express.bodyParser()しない場合のデフォルトは100kbですlimit

試してください:

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

1
こんにちは-私は次を使用しています:app.get( '/ api / 0.1 / people /'、express.bodyParser({limit: '100mb'})、tracks.all); 引き続き同じエラーが発生します...
マイクジェームズ2013年

デフォルトの制限、それが今思えるよう100kbyteです github.com/expressjs/body-parser#limit
Qiong呉

15

私の場合..設定parameterLimit:50000は問題を修正しました

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

これでうまくいきました。「リクエストエンティティが大きすぎます」は、大きな文字列(JSONなど)も参照するようです。私は〜20Kib JSONを投稿していて、この問題がありました(デフォルトのbody-parserペイロードサイズ制限は私にとっては問題ないことに注意してください)。parameterLimitのみで解決されました(limits を設定する必要はありません)。
aesede

13

2016年、ボディパーサーの「制限」に加えて「タイプ」を明示的に設定するまで、上記のいずれも機能しませんでした。例:

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

はい、これも私がする必要があったことです。また、設定されているため、アプリスクリプトから構成設定を実行できます。
Robb Sadler 2016年

3
application/x-www-form-urlencoded(ではなくapplication/x-www-form-urlencoding)という意味ですか?
グレネード

12

以下は私のために働きました...ちょうど使用してください

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

それでおしまい。

上記すべてを試しましたが、どれもうまくいきませんでした。次のように使用しても、

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

最初のapp.use(bodyParser());1行だけが定義され、後の2行は無視されました。

参照:https : //github.com/expressjs/body-parser/issues/176 >>「2016年6月17日にコメントされたダグウィルソン」を参照


1
ありがとうございました!古いapp.use(bodyParser.json());も使用しました。以前のコードでは、実際、最初のコードのみが使用されます。
ニコ


6

私の場合、問題はNginx構成にありました。それを解決するには、ファイルを編集する必要があります。/etc/nginx/nginx.conf次の行をサーバーブロック内に追加します。

client_max_body_size 5M;

Nginxを再起動し、問題を解消

sudo systemctl restart nginx

5

私はこの問題に対して、マルチ依存性の別の方法を使用しました。

例:

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

少し古い投稿ですが、同じ問題がありました

express 4. +を使用すると、私のコードは次のようになり、2日間の広範なテストを行った後、うまく機能します。

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

少し異なるアプローチ-ペイロードが大きすぎる

これまでのすべての役立つ答えは、ペイロード制限の増加に対処しています。しかし、ペイロードが実際には大きすぎる場合もありますが、理由はありません。正当な理由がない場合は、そもそもなぜ肥大化しているのかを検討することを検討してください。

私たち自身の経験

たとえば、私たちのケースでは、Angularアプリがペイロードでオブジェクト全体を貪欲に送信していました。肥大した冗長なプロパティが1つ削除されると、ペイロードサイズは100分の1に減少しました。これにより、パフォーマンスが大幅に向上し、413エラーが解決されました。


4

何度も試した後、私は私の解決策を得ました

この行にコメントしました

app.use(bodyParser.json());

そして私は

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

その後、動作します



2

より良い使い方は、与えられた行に示されているようにファイルサイズの制限を指定することができます:

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

node-modules body-parserのデフォルト設定を変更することもできます。次に、libフォルダーにJSONとテキストファイルがあります。次に、ここで制限を変更します。実際、この条件は、指定された行で制限パラメーターを渡さない場合に成功します。app.use(bodyParser.json({limit: '10mb'、extended:true}))。


1

私もその問題に直面しました、私はapp.use(bodyParser.json())以下を繰り返すことによって愚かな間違いをしていました:

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

を削除することによりapp.use(bodyParser.json())、問題を解決しました。


1

私の場合Content-type、リクエストヘッダーからの削除は機能しました。


0

私にとっての主なトリックは

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

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

bodyParse.json 1番目のbodyParse.urlencoded 2番目


0

express.json()bodyParserを一緒に使用している場合、Expressが独自の制限を設定するため、エラーが発生します。

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

上記のコードを削除し、コードの下に追加する

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

@ tomislav-stankovicをフォーマットしていただきありがとうございます
NIKIT PULEKAR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.