我收到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));


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

我相信这是以八位字节为单位的,为1.0787兆字节。

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

评论

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

@StephenTetreault我想您应该添加它作为答案,尽管它当然并不适用于所有人,但这确实是发生在我身上的荣誉。

#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
 


我们可以看到,首先,在加载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,请将其添加到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'}));,但在app.use(express.json());之后。 Express会将全局限制设置为1mb,因为他在运行脚本时遇到的第一个解析器是express.json()。将bodyParser移到上面可以解决问题。

这就是说,在Connect 3.0中将弃用bodyParser()方法,因此不应使用。相反,您应该像这样显式声明解析器:

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


以防您需要分段(用于文件上传),请参阅此帖子。

[第二次编辑]

请注意,在Express 4中,您必须使用body-parser模块,而不是express.json()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的自述文件。

[第三次编辑]

在Express v4.16.0及更高版本中,似乎可以回到执行此操作的初始方式(感谢@GBMan提示):

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


评论


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

–塞缪尔·博尔杜克(Samuel Bolduc)
13年11月14日在2:22

对于express 4,指示的代码在urlencoded调用中引发“ body-parser不建议使用的未定义扩展:提供扩展选项”

– Mike'Pomax'Kamermans
2014年10月4日19:17

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

– S水
2015年11月4日6:00

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

–奥汉
16-2-16在17:49



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

–BastianBuhrkall
16年5月20日在9:29

#2 楼

在我的情况下,仅添加以下行是不够的:
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
16年4月19日在15:49

添加“ parameterLimit:50000”可以解决该问题。

–安德烈·佩森(Andrien Pecson)
17年8月8日在7:32

在找到这个答案之前,我一直在为此苦苦挣扎。谢谢! #缓解

–斯蒂芬·塞利斯(Stephan Celis)
18年8月26日在7:30

#3 楼

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

client_max_body_size 100M; #100mb


评论


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

–user993683
17年6月2日在16:38

非常感谢您提供此答案,我认为应该对此答案予以推荐,因为它很重要,我个人忘记了nginx配置...再次非常感谢

–法迪·阿博·姆萨拉姆(Fadi Abo Msalam)
18年3月12日在20:21

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

–alexdykyі
18-10-31在14:32

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

–亚历山大
18年11月1日在23:20

谢谢!如果我没有发现这个答案,我会再追寻错误的解决方案2个小时。

–詹姆斯·弗兰克(James Flight)
5月20日9:15

#4 楼

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

尝试:

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


评论


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

–麦克·詹姆斯
13年11月12日20:50



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

–吴琼
16年8月30日在16:14



#5 楼

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

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


评论


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

– aesede
16年7月20日在16:01



#6 楼

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


评论


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

–罗布·萨德勒
16年6月30日在13:35

您的意思是application / x-www-form-urlencoded(而不是application / x-www-form-urlencoding)吗?

–手榴弹
17年6月15日在8:09

#7 楼

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

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

评论


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

–尼科
18年11月24日在1:01

#8 楼

对于express〜4.16.0,具有limit的express.json可直接运行

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


#9 楼

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

client_max_body_size 5M;


重新启动Nginx并解决问题

sudo systemctl restart nginx


#10 楼

经过许多尝试后,我得到了解决方案

我已经评论了此行

app.use(bodyParser.json());


我放了

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


然后起作用

评论


谢谢,这就是我所需要的!

–Anas
11月26日下午16:31

#11 楼

对于此问题,我使用了另一种方法,具有更高的依赖性。

示例:

#12 楼

小老帖子,但我遇到了相同的问题

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


#13 楼

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



到目前为止,所有有用的答案都涉及增加有效负载限制。但是也可能是有效载荷确实太大但没有充分理由的情况。如果没有正当的理由,请考虑一下为什么它会如此肿。应用正在贪婪地发送有效负载中的整个对象。删除了一个肿的冗余属性后,有效负载大小减少了100倍。这显着提高了性能并解决了413错误。

#14 楼

对我来说,以下代码段解决了该问题。

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


#15 楼

就我而言,从请求标头中删除Content-type起作用。

#16 楼

更好的用法是指定文件大小的限制,如给定行中所示: -parser然后在lib文件夹中,有JSON和文本文件。然后在此处更改限制。实际上,如果您未在给定行中传递limit参数,则此条件通过。
app.use(bodyParser.json({limit:'10mb',extended:true})))。

#17 楼

如果同时使用express.json()和bodyParser,则由于express设置其自身的限制,将产生错误。 />
app.use(express.json());
app.use(express.urlencoded({ extended: false }));


#18 楼

我也面临这个问题,我通过重复如下所示的app.use(bodyParser.json())犯了一个愚蠢的错误:

#19 楼

我最近遇到了同样的问题,下面的解决方案对我有用。

Dependency : 
express >> version : 4.17.1
body-parser >> version": 1.19.0


const express = require('express');
const bodyParser = require('body-parser');

const app = express(); 
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

对于理解:
HTTP 431

HTTP 413有效负载过大响应状态代码指示
请求实体大于服务器定义的限制;服务器
可能关闭连接或返回Retry-After标头字段。


#20 楼

对我来说,主要技巧是

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

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


bodyParser.json首先是
bodyParse.urlencoded第二是

#21 楼

对于那些在IIS下在Azure中启动NodeJS应用的用户,请不要忘记按照此处所述修改web.config,Azure App Service IIS的“ maxRequestLength”设置

#22 楼

Express 4.17.1
app.use( express.urlencoded( {
    extended: true,
    limit: '50mb'
} ) )

演示csb

#23 楼

下面的设置对我有用
Express 4.16.1
app.use(bodyParser.json({ limit: '50mb' }))
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: false,
}))

Nginx
client_max_body_size 50m
client_body_temp_path /data/temp