错误:请求实体太大


467

我收到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中有以下使用声明

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

在提琴手中,我可以看到content-length标头,其值为:1078702

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

我不知道为什么express不让我发布以前在另一个未使用均值堆栈项目结构的express项目中发布的json数组。


5
给任何遇到此问题的人的快速注释-确保您的问题实际上是节点服务器或主体解析器。例如,我正确使用了正文解析器,但出现此错误,因为我要在NGINX conf文件中设置最大正文大小。
Stephen Tetreault,

@StephenTetreault我想您应该补充一点,尽管它当然并不适用于所有人,但这确实是发生在我身上的荣誉。
Dado

Answers:


988

最近我遇到了同样的错误,发现的所有解决方案都无法正常工作。

经过一番挖掘,我发现设置app.use(express.bodyParser({limit: '50mb'}));确实正确设置了限制。

当添加一个console.log('Limit file size: '+limit);in 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重置limit参数并忽略我们指定的内容。我尝试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会将全局限制设置为1mb,因为他在运行脚本时遇到的第一个解析器是express.json()。移动bodyParser它上面的伎俩。

也就是说,该bodyParser()方法将在Connect 3.0中弃用,并且不应该使用。相反,您应该显式声明解析器,如下所示:

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

如果您需要多部分内容(用于文件上传),请参阅此帖子

[第二次编辑]

请注意,在Express 4中,必须使用body-parser模块而不是express.json()and express.urlencoded(),并使用其and 方法,如下所示: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

[第三编辑]

似乎从Express v4.16.0开始,我们可以回到执行此操作的初始方法(感谢@GBMan的提示):

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

7
我的问题是我在bodyParser上方放置了express.json()解析器...了解了所有工作原理后,我删除了bodyParser并在另一个中设置了de limit,例如app.use(express.json({limit:'50mb'}));。我编辑了答案以反映这一点!
塞缪尔·博尔杜克

2
对于Express 4,指示的代码在urlencoded通话中引发“ body-parser不建议使用的未定义扩展:提供扩展选项”
Mike'Pomax'Kamermans 2014年

3
感谢您对Express 4进行更新。您可以挽救生命!
Swills 2015年

36
这是这个答案所获得的全面信息,因此,如果您在node.js / express实例之前使用nginx作为反向代理,那么我还需要进一步参考,这也是推荐做法。Nginx将抛出相同的413::Request Entity is too large异常。它不会将请求转发到您的快速应用程序。因此,我们需要client_max_body_size 50M;在nginx配置或特定服务器配置中进行设置,或者甚至可以使用特定位置标签。
Aukhan

3
谢谢塞缪尔!让我从头疼的世界中解救出来,干杯和+1获得全面的解答!
BastianBuhrkall,2016年

117

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

parameterLimit是我缺少的另一个陷阱,感谢您指出这一点。
crowebird

1
添加“ parameterLimit:50000”可以解决该问题。
安德里恩·派克森

1
在找到这个答案之前,我一直在为此苦苦挣扎。谢谢!#Relieve
Stephan Celis

这正是我想要的!
ApplePie

我一直在为标记的解决方案苦苦挣扎,但这很有帮助。
艾哈迈德·汗

55

如果有人尝试了所有答案,但还没有成功,并使用NGINX托管站点,则将此行添加到/ etc / nginx / sites-available

client_max_body_size 100M; #100mb

4
这是我的问题,谢谢!一个提示是,nginx的默认值为1MB,因此,如果您似乎受限于该数量,则可能是nginx。另外,另一个线索是:body-parser 在错误对象中返回一个limit属性和一个length属性(以及status:413)。Nginx不会这样做。因此,如果您在错误对象中看不到这些属性,则可能是nginx限制。以下是更改此nginx设置(配置文件最可能在中/etc/nginx/sites-available/)的方法

2
非常感谢您提供此答案,我认为此答案很重要,因为它很重要,我个人忘记了nginx配置...再次非常感谢
Fadi Abo Msalam

如何仅在快递中设置限额?
аlexdykyі

Vivek22的@аlexdykyі答案:app.use(bodyParser({limit:'50mb'}));
亚历山大

这是一个问题!谢谢!
维克多

31

我不认为这是明确的全局大小限制,而是具体来说connect.json中间件限制。默认情况下,当您使用express.bodyParser()并且不提供limit选项。

尝试:

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

1
嗨-我正在使用以下代码:app.get('/ api / 0.1 / people /',express.bodyParser({limit:'100mb'}),tracks.all); 我仍然收到相同的错误...
Mike James

默认限制为100 KB,因为现在看起来 像是github.com/expressjs/body-parser#limit
Qiong Wu

15

就我而言..设置parameterLimit:50000解决了问题

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

这对我有用。“请求实体太大”似乎也指大字符串(如JSON)。我正在发布〜20Kib JSON,并遇到了这个问题(请注意,默认body-parser有效负载大小限制对我来说是可以的)。解决了与parameterLimit只(无需设置任何limitS)。
aesede '16

13

2016年,以上内容对我没有帮助,直到我明确为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-urlencoded' })

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

是的,这也是我需要做的。它已经设置好,因此您可以从应用脚本中驱动配置设置。
罗布·萨德勒

3
您的意思是application/x-www-form-urlencoded(而不是application/x-www-form-urlencoding)?
手榴弹

12

以下对我有用...只需使用

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日发表评论'


1
谢谢!我也有一个旧的app.use(bodyParser.json()); 实际上,在我的代码中,只有第一个被采用!
Nico

8

对于Express〜4.16.0,具有limit的express.json可直接工作

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

6

就我而言,问题出在Nginx配置上。为了解决这个问题,我必须编辑文件:/etc/nginx/nginx.conf并将此行添加到服务器块中:

client_max_body_size 5M;

重新启动Nginx,问题消失了

sudo systemctl restart nginx

5

我使用了依赖关系的方法来解决这个问题。

例:

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

5

小老帖子,但我有同样的问题

使用express 4. +,我的代码看起来像这样,经过两天的广泛测试,它可以很好地工作。

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

4

稍微不同的方法-有效负载太大

到目前为止,所有有用的答案都涉及增加有效负载限制。但是,也可能是有效载荷确实太大但没有充分理由的情况。如果没有正当理由,请考虑一下为什么它这么so肿。

我们自己的经验

例如,在我们的案例中,一个Angular应用正在贪婪地发送有效载荷中的整个对象。当删除一个肿且多余的属性时,有效负载大小减少了100倍。这显着提高了性能并解决了413错误。


4

经过几次尝试后,我得到了解决方案

我已经评论了这一行

app.use(bodyParser.json());

然后我把

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

然后就可以了


3

以下片段对我来说解决了问题。

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

2

如指定行所示,可以更好地使用文件大小的限制:

app.use(bodyParser.json({limit: '10mb', extended: true}))
app.use(bodyParser.urlencoded({limit: '10mb', extended: true}))

您也可以在node-modules body-parser中更改默认设置,然后在lib文件夹中有JSON和文本文件。然后在此处更改限制。实际上,如果您未在给定行app.use(bodyParser.json({limit:'10mb',extended:true}))中传递limit参数,则此条件通过。


1

我也遇到了这个问题,我在重复app.use(bodyParser.json())下面的操作,这是一个愚蠢的错误:

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

通过删除app.use(bodyParser.json()),解决了问题。


1

就我而言,Content-type从请求标头中删除是可行的。


0

对我来说,主要诀窍是

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

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

bodyParse.json第一个bodyParse.urlencoded第二个


0

如果您express.json()bodyParser一起使用,则会因为Express设置其自身的限制而产生错误。

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

删除上面的代码,只添加下面的代码

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));

感谢格式化@ tomislav-stankovic
NIKIT PULEKAR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.