错误:请求实体太大

我收到以下错误与快递:

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中有以下使用语句

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

在小提琴手中,我可以看到内容长度标头的值为:1078702

我相信这是八位字节,这是1.0787兆字节。

我不知道为什么快递不让我发布我以前在另一个没有使用平均堆栈项目结构的快递项目中发布的JSON数组。

我最近有同样的错误,我find的所有解决scheme都不起作用。

经过一番挖掘,我发现设置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 

我们可以看到,首先在加载connect模块时,限制设置为1mb(1048576字节)。 然后,当我设置限制, console.log被再次调用,这一次的限制是52428800(50MB)。 但是,我仍然得到一个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参数,但也没有运气。

虽然我没有find任何正确的方法来永久设置它,但可以直接将其“ 修补 ”到模块中。 如果您使用的是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,行号可能会有所不同。 请注意,这是一个不好的做法 ,如果你更新你的模块将被覆盖

所以这个临时的解决scheme现在可以工作,但是一旦find解决scheme(或者模块被修复,万一它是一个模块问题),你应该相应地更新你的代码。

我已经在他们的Github上解决了这个问题。

[编辑 – find解决scheme]

经过一番研究和testing,我发现在debugging时,我添加了app.use(express.bodyParser({limit: '50mb'})); ,但是 app.use(express.json()); 。 然后,Express会将全局限制设置为1mb,因为运行脚本时遇到的第一个parsing器是express.json() 。 移动bodyParser之上它做了伎俩。

也就是说, bodyParser()方法将在Connect 3.0中被弃用,不应该被使用。 相反,你应该声明你的parsing器,就像这样:

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

如果你需要多部分(file upload)看到这个职位 。

第二次编辑

请注意,在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})); 

如果未对bodyParser.urlencoded()明确定义extended选项,则会引发警告( body-parser deprecated undefined extended: provide extended option )。 这是因为这个选项在下一个版本中是必需的, 不再是可选的。 有关extended选项的更多信息,请参阅body-parser的自述文件 。

我使用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})); 

我不认为这是明确的全局大小限制,但特别是connect.json中间件的限制 。 当您使用express.bodyParser()时,默认为100kb,不提供limit选项。

尝试:

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

如果有人尝试了所有的答案,但是还没有成功,并且使用NGINX来托pipe这个站点,那么把这一行添加到/ etc / nginx / sites-available

 client_max_body_size 100M; //100mb 

2016年,以上都没有为我工作,直到我明确设置“types”除了bodyparser的“限制”,例如:

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

在我的情况..设置parameterLimit:50000固定的问题

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

对于这个问题,我已经采取了另外一种方法来解决这个问题。

例:

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

小老职位,但我有同样的问题

使用快递4. +我的代码看起来像这样,经过两天的广泛testing,它工作得很好。

 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({limit: '50mb'})); 

而已。

试过以上都没有工作。 发现即使我们使用如下,

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

只有第一个app.use(bodyParser()); 一个被定义,后两行被忽略。

请参阅: https : //github.com/expressjs/body-parser/issues/176 >>参见“dougwilson评论于2016年6月17日”