web-dev-qa-db-ja.com

エラー:要求エンティティが大きくすぎます

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に次のuse文があります。

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

フィドラー内で、値が1078702のcontent-lengthヘッダーを見ることができます。

私はこれが八重奏であると信じます、これは1.0787メガバイトです。

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

364
mike james

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

いくつか調べたところ、app.use(express.bodyParser({limit: '50mb'}));を設定することで制限が正しく設定されたことがわかりました。

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

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を受け取ります。

それから私はnode_modules/express/node_modules/connect/node_modules/raw-body/index.js:10console.log('Limit file size: '+limit);を追加し、(エラー出力の前に)大きなリクエストでルートを呼び出すときコンソールに別の行を見ました:

Limit file size: 1048576

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

恒久的に設定する適切な方法が見つかりませんでしたが、モジュール内で直接 "patch"することができます。 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'}));を追加しましたが、afterapp.use(express.json());を追加しました。スクリプトを実行したときに彼が最初に遭遇したパーサーはexpress.json()だったので、Expressはグローバル制限を1mbに設定します。その上にbodyParserを移動するとうまくいきました。

そうは言っても、bodyParser()メソッドはConnect 3.0では推奨されなくなり、使用してはいけません。代わりに、次のようにパーサーを明示的に宣言する必要があります。

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

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

2回目の編集

Express 4では、express.json()およびexpress.urlencoded()の代わりに、 body-parser モジュールを必要とし、その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)がスローされます。これは、このオプションが次のバージョンで必要になり、notがオプションになるためです。 extendedオプションの詳細については、body-parserreadme を参照してください。

801
Samuel Bolduc

私は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}));
83
slorenzo

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

client_max_body_size 100M; #100mb
36
Alexander

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

試してください:

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

私の場合は.. parameterLimit:50000を設定すると問題が解決しました

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

2016年、bodyparserの 'limit'に加えて 'type'を明示的に設定するまで、上記のいずれも機能しませんでした。例:

  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-urlencoding' })

  app.use(jsonParser);
  app.use(urlencodedParser);
10
user1709076

以下は私のために働いた...ちょうど使用

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 >> 'dougwilsonにコメントしました2016年6月17日'

7
Vivek22

Express〜4.16.0では、limit付きのexpress.jsonは直接動作します

app.use(express.json({limit: '50mb'}));
4
Stenal P Jolly

少し古い投稿ですが、私は同じ問題を抱えていました

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

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

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

app.use(bodyParser.json());

そして私は置く

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

それからそれは働く

4
Maulik Patel

私はこの問題に別の習慣を用いました。

例:

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);
};
3
Quentin Malguy

少し違うアプローチ - ペイロードは 大きすぎる

これまでの有用な回答はすべて、ペイロード制限の引き上げに関するものです。しかし、ペイロードが実際には大きすぎることも事実ですが、正当な理由はありません。正当な理由がない場合は、そもそもなぜそんなに肥大化しているのかを検討してください。

私たち自身の経験

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

3
Boaz

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

client_max_body_size 5M;

Nginxを再起動して問題が解決した

Sudo systemctl restart nginx
2
Jaime Fernandez

私にとってスニペットは問題を解決しました。

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

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

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

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

0
WasiF

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

app.use(bodyParser.json({制限: '10mb'、extended:true}))app.use(bodyParser.urlencoded({制限: '10mb'、extended:true}))

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

0
Ravi Beniwal

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

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

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

bodyParser.json最初のbodyParser.urlencoded 2番目

0