30秒で解決する方法手っ取り早い解決策をお探しですか?Expressのメモリ使用制限を緩和するだけです。Express 4.16.0以降を使用している場合は、メインのアプリファイルで組み込みのJSONおよびURLエンコードパーサーにlimitオプションを追加します。
const express = require('express');
const app = express();
// JSONボディの制限を増やす
app.use(express.json({ limit: '50mb' }));
// URLエンコードされたボディの制限を増やす
app.use(express.urlencoded({ limit: '50mb', extended: true }));
古い環境を使用していますか?古いバージョンのExpressを使用している場合や、スタンドアロンのbody-parserパッケージを使用している場合でも、構文はほぼ同じです。
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
なぜExpressが拒否するのかデフォルトでは、Expressは受信リクエストをわずか100KBに制限しています。このセーフガードは、攻撃者が巨大なペイロードでサーバーをダウンさせるのを防ぐためのものです。これは賢明なセキュリティ対策ですが、正当な5MBの画像や大きなJSONオブジェクトもブロックしてしまいます。クライアントがこの制限を超えるペイロードを送信すると、ミドルウェアはHTTP 413ステータスを返し、リクエストを即座に停止します。
PayloadTooLargeError: request entity too large at readStream (.../node_modules/body-parser/lib/read.js:71:17)
変更を適用する場所### 1. Express組み込みミドルウェアExpress 4.16以降を使用している場合、追加のbody-parserパッケージは不要です。app.jsまたはserver.jsで直接制限を設定してください。これらの行は、ルート定義の前に記述しないと効果がないので注意してください。
// server.js
const express = require('express');
const app = express();
// アプリが実際に処理する内容に基づいて、これらの制限を調整します
app.use(express.json({ limit: '25mb' }));
app.use(express.urlencoded({
limit: '25mb',
extended: true,
parameterLimit: 50000
}));
app.post('/api/upload', (req, res) => {
console.log('受信したボディサイズ:', JSON.stringify(req.body).length);
res.send('成功');
});
2. ファイルアップロードの処理 (Multipart/Form-Data)express.json()の制限は、multerやbusboyで処理されるファイルアップロードには適用されません。代わりに、その特定のミドルウェア内で制限を設定する必要があります。
const multer = require('multer');
const upload = multer({
limits: { fileSize: 50 * 1024 * 1024 } // 50MBの制限
});
app.post('/profile', upload.single('avatar'), (req, res) => {
res.send('ファイルがアップロードされました!');
});
3. Nginxのボトルネックコードに問題がなくても、インフラ側が障壁となっている場合があります。Node.jsの設定を更新しても依然として413エラーが発生する場合、Nginxが原因である可能性が高いです。デフォルトでは、Nginxは1MBを超えるリクエストを拒否します。
Nginxの設定(/etc/nginx/nginx.confまたはサイト別の設定ファイル)を更新します:
server {
client_max_body_size 50M;
location / {
proxy_pass http://localhost:3000;
}
}
設定をテストし、サービスをリロードするのを忘れないでください:
sudo nginx -t
sudo systemctl reload nginx
修正されたことを確認する方法設定を鵜呑みにせず、新しい制限をテストしましょう。curlを使用して、以前のデフォルトである100KBより大きく、新しいしきい値より小さいペイロードを送信してみます。
まず、200KBのダミーJSONファイルを生成します:
node -e "console.log(JSON.stringify({data: 'x'.repeat(200000)}))" > large_payload.json
次に、ローカルサーバーに対して実行します:
curl -X POST -H "Content-Type: application/json" -d @large_payload.json http://localhost:3000/your-endpoint
413 Payload Too Largeの代わりに200 OKが返ってくれば、設定完了です。

