web-dev-qa-db-ja.com

NodeJSルーターのペイロードが大きすぎます

Nodejsアプリケーションで次のようにRESTエンドポイントを作成しています。

私のserver.jsには、次のコードがあります。

var express = require('express');
var app = express();
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: true }));
app.use(require('./routes/APIRoutes'));

また、重複する可能性のある質問で提案されているように、express.jsonとexpres.urlencodedを使用する代わりに、以下のコードを試しました。

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

APIRoutesファイルには、次のコードがあります。

/* --- INIT --- */
var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
router.use(bodyParser.json({ limit: '50mb' }));
router.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

var urlencodedParser = bodyParser.urlencoded({ limit: '50mb', extended: true });

router.post('...', urlencodedParser, function (req, res) {
...
});

制限を高く設定するために、さまざまな組み合わせと順序を試しました。しかし現在、2kbのペイロードを送信するたびに、413 "(Payload Too Large)"エラーが返されます。

制限を設定するための正しい場所は何ですか?

3
Stephan Celis

私は、TKJohnの提案された複製の受け入れられない回答の1つで、私の問題の解決策を見つけました。コードが次のようになるように、パラメーター制限を追加する必要がありました。

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

追加後、それは機能しました!

APIRoutes.jsからコードを削除することもできました

router.use(bodyParser.json({ limit: '50mb' }));
router.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
8
Stephan Celis

過去数時間オンラインで検索しようとしましたが、413ペイロードの解決策が見つかりませんでした

rlencoded.jsで判明しました。body-parserモジュール内には、制限を処理する追加のオプションがあります。

parameterLimitarrayLimitなどのオプションは、パラメーターまたは配列のサイズがデフォルトで許可されている制限(配列サイズの場合は100)を超えた場合に修正する項目です。

1
Edmund Chan

最新バージョンのexpressを使用している場合は、これをexpressですぐに使用できます。

    let express = require('express');

    let app = express();

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

これはexpressにバンドルされているbodyParserバージョンでのみ機能することに注意してください(bodyParserexpressに追加されましたリリース 4.16.

0
Sudheesh R