1. ホーム
  2. javascript

[解決済み】エラー:リクエストのエンティティが大きすぎる

2022-01-30 01:18:25

質問内容

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

meanstackを使用しています。私のexpress.jsには次のようなuse文があります。

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

fiddler内では、content-lengthヘッダの値が確認できます。1078702

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

以前、平均的なスタックプロジェクト構造を使用していない別のエクスプレスプロジェクトで投稿していたjson配列を、なぜエクスプレスが投稿させてくれないのか、まったくわかりません。

どうすればいいですか?

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

いろいろと調べてみると app.use(express.bodyParser({limit: '50mb'})); は、制限を正しく設定しました。

を追加した場合 console.log('Limit file size: '+limit);node_modules/express/node_modules/connect/lib/middleware/json.js:46 を実行し、nodeを再起動すると、コンソールに次のような出力が表示されます。

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 bytes)に制限されています。その後、制限をかけると 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

これはつまり、何らかの形で、どこかで connect は limit パラメータをリセットし、指定したものを無視します。試しに bodyParser のパラメータを個別にルート定義に追加しましたが、これもうまくいきませんでした。

永続的に設定する適切な方法は見つかりませんでしたが、" パッチ モジュールに直接書き込んでください。Express 3.4.4 を使用している場合、次の行を追加します。 node_modules/express/node_modules/connect/lib/middleware/json.js :

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

同じバージョンのExpressを使用していない場合、行番号が異なる場合があります。 ご注意ください。 バッドプラクティス となり 上書き モジュールを更新した場合

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

を開設しました。 をGitHubのissueに登録しました。 この問題については

[編集 - 解決策が見つかりました].

いろいろ調べて試した結果、デバッグ時に 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回目の編集]。

なお、Express4では express.json()express.urlencoded() を指定する必要があります。 ボディパーサー モジュールを使用し、その json()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 オプションは リードミー body-parser .

[第三の編集]

Express v4.16.0 以降では、初期の方法に戻せるようです(@GBMan さんのご指摘に感謝します)。

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