Expressで'PayloadTooLargeError'を修正:リクエスト制限を増やす方法

beginner💚 Node.js2026-04-24| Node.js (v10+), Express.js (4.x), body-parser ミドルウェア, Nginx リバースプロキシ

Error Message

PayloadTooLargeError: request entity too large at readStream (.../node_modules/body-parser/lib/read.js:71:17)
#Node.js#Express.js#body-parser#HTTP 413

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()の制限は、multerbusboyで処理されるファイルアップロードには適用されません。代わりに、その特定のミドルウェア内で制限を設定する必要があります。

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が返ってくれば、設定完了です。

セキュリティに関する最後の注意フラストレーションから制限を1GBに設定しないでください。高い制限は、メモリ枯渇攻撃の格好の標的になります。写真は10MB、大きなフォームは25MBなど、アプリが実際に必要とする値にのみ引き上げてください。巨大なファイルを扱う場合は、バッファリングせず、AWS S3などのクラウドプロバイダーに直接ストリーム送信して、サーバーのメモリ使用量を低く抑えるようにしましょう。

Related Error Notes