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
私はmeanstackを使用しています。express.jsに次のuseステートメントがあります。
//Set Request Size Limit
app.use(express.limit(100000000));
フィドラー内では、content-lengthヘッダーの値が1078702であることがわかります。
これはオクテット単位だと思いますが、1.0787 メガバイトです。
以前、Mean Stack プロジェクト構造を使用していない別の Express プロジェクトに投稿していた JSON 配列を Express で投稿できない理由がわかりません。
ベストアンサー1
最近同じエラーが発生しましたが、試した解決策はすべて機能しませんでした。
少し調べてみると、設定によって制限が正しく設定されapp.use(express.bodyParser({limit: '50mb'}));
ていることがわかりました。
console.log('Limit file size: ' + limit);
ノードを追加して再起動するとnode_modules/express/node_modules/connect/lib/middleware/json.js:46
、コンソールに次の出力が表示されます。
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
最初にモジュールをロードするときに、制限が 1 MB (1048576 バイト) に設定されていることがわかりますconnect
。次に制限を設定すると、がconsole.log
再度呼び出され、今度は制限が 52428800 (50 MB) になります。ただし、まだ が表示されます413 Request entity too large
。
次に、大きなリクエストでルートを呼び出したときにコンソールに別の行がconsole.log('Limit file size: '+limit);
表示node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10
されました (エラー出力の前)。
Limit file size: 1048576
これは、何らかの理由で、どこかでconnect
制限パラメータがリセットされ、指定した内容が無視されることを意味します。bodyParser
ルート定義でパラメータを個別に指定してみましたが、うまくいきませんでした。
これを永続的に設定するための適切な方法は見つかりませんでしたが、モジュールに直接「パッチ」を適用することができます。Express 3.4.4 を使用している場合は、次の行の 46 に追加しますnode_modules/express/node_modules/connect/lib/middleware/json.js
。
limit = 52428800; // for 50mb, this corresponds to the size in bytes
同じバージョンの Express を実行していない場合、行番号が異なる場合があります。これは悪い習慣であり、モジュールを更新すると上書きされることに注意してください。
したがって、この一時的な解決策は今のところ機能しますが、解決策が見つかったら(またはモジュールの問題の場合はモジュールが修正されたら)、それに応じてコードを更新する必要があります。
開けましたGitHubの問題この問題について。
[編集 - 解決策が見つかりました]
調査とテストを行った結果、デバッグ時に を追加しましたapp.use(express.bodyParser({limit: '50mb'}));
が、の後に app.use(express.json());
、スクリプトの実行時に最初に遭遇したパーサーが であったため、Express はグローバル制限を 1 MB に設定してしまうことがわかりましたexpress.json()
。その上に移動するbodyParser
ことで問題が解決しました。
ただし、このbodyParser()
メソッドは Connect 3.0 では非推奨になるため、使用しないでください。代わりに、次のようにパーサーを明示的に宣言する必要があります。
app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
マルチパート(ファイルアップロード用)が必要な場合は、この郵便受け。
[2回目の編集]
express.json()
Express 4では、およびの代わりにexpress.urlencoded()
、ボディパーサーモジュールを作成し、そのメソッド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
) が表示されます。これは、このオプションが次のバージョンで必須となり、オプションではなくなるためです。オプションの詳細についてはextended
、リードミーのbody-parser
。
[3回目の編集]
Express v4.16.0 以降では、これを実行するための最初の方法に戻ることができるようです (ヒントを提供してくれた @GBMan に感謝します)。
app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));