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配列を投稿させてくれないのか私にはわかりません。
私は最近同じエラーがありました、そして私が見つけたすべての解決策はうまくいきませんでした。
いくつか調べたところ、app.use(express.bodyParser({limit: '50mb'}));
を設定することで制限が正しく設定されたことがわかりました。
node_modules/express/node_modules/connect/lib/middleware/json.js:46
にconsole.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:10
にconsole.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-parser
の readme を参照してください。
私は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}));
誰かがすべての答えを試したが、まだ成功しておらず、サイトのホスティングにNGINXを使用している場合は、/ etc/nginx/sites-availableにこの行を追加してください。
client_max_body_size 100M; #100mb
私はこれが明示的なグローバルサイズの制限ではないと思いますが、具体的には connect.jsonミドルウェアの制限 です。 express.bodyParser()
を使用し、limit
オプションを提供しない場合、これはデフォルトで100kbです。
試してください:
app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
私の場合は.. parameterLimit:50000
を設定すると問題が解決しました
app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: true,
parameterLimit:50000
}));
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);
以下は私のために働いた...ちょうど使用
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日'
Express〜4.16.0では、limit付きのexpress.jsonは直接動作します
app.use(express.json({limit: '50mb'}));
少し古い投稿ですが、私は同じ問題を抱えていました
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'}))
それからそれは働く
私はこの問題に別の習慣を用いました。
例:
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);
};
これまでの有用な回答はすべて、ペイロード制限の引き上げに関するものです。しかし、ペイロードが実際には大きすぎることも事実ですが、正当な理由はありません。正当な理由がない場合は、そもそもなぜそんなに肥大化しているのかを検討してください。
たとえば、私たちの場合、Angularアプリは、ペイロード内のオブジェクト全体を積極的に送信していました。 1つの肥大化した冗長なプロパティが削除されたとき、 ペイロードサイズは100分の1に減少しました 。これによりパフォーマンスが大幅に向上し、413エラーが解決しました。
私の場合、問題は Nginxの設定 にありました。これを解決するには、ファイル/etc/nginx/nginx.conf
を編集し、サーバーブロック内に次の行を追加します。
client_max_body_size 5M;
Nginxを再起動して問題が解決した
Sudo systemctl restart nginx
私にとってスニペットは問題を解決しました。
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())
を削除することで、問題を解決しました。
それが与えられた行に示されているようにあなたがより良い使用あなたはあなたのファイルサイズの制限を指定することができます
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パラメータを渡さないと、この条件は成立します。
私にとっての主なトリックは
app.use(bodyParser.json({
limit: '20mb'
}));
app.use(bodyParser.urlencoded({
limit: '20mb',
parameterLimit: 100000,
extended: true
}));
bodyParser.json最初のbodyParser.urlencoded 2番目