错误:请求实体太大

IT技术 javascript node.js http express
2021-01-24 21:01:04

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

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

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

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

6个回答

我最近遇到了同样的错误,我找到的所有解决方案都不起作用。

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

我们可以看到,一开始加载connectmodule时,限制设置为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单独指定路由定义中参数,但也没有运气。

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

所以这个临时解决方案现在有效,但是一旦找到解决方案(或修复module,以防它是module问题),您应该相应地更新您的代码。

在他们的 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'}));

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

[第二次编辑]

需要注意的是在快递4,而不是express.json()express.urlencoded(),你必须要求身体解析器module,并使用其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'}));
对于 express 4,指示的代码在urlencoded调用时抛出“body-parser deprecated undefined extended: provide extended option”
2021-03-13 21:01:04
感谢您为 express 4 更新此内容。您是救星!
2021-03-14 21:01:04
这和这个答案一样全面,所以如果您在 node.js/express 实例前使用 nginx 作为反向代理,我还会遇到一点供将来参考,这也是推荐的做法。Nginx 会抛出同样的413::Request Entity is too large异常。它不会将请求转发到您的快递应用程序。所以我们需要client_max_body_size 50M;在 nginx 配置或特定的服务器配置或特定的位置标签中进行设置。
2021-03-19 21:01:04
谢谢塞缪尔!让我免于头痛,干杯和 +1 的全面答案!
2021-03-20 21:01:04
我的问题是我的 bodyParser 上面有 express.json() 解析器......在了解它是如何工作的之后,我删除了 bodyParser 并在另一个中设置了限制,比如app.use(express.json({limit:'50mb'}));. 我编辑了我的答案以反映这一点!
2021-03-22 21:01:04

在我的情况下,添加这些行是不够的:

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}));
在找到这个答案之前,我一直在努力解决这个问题。谢谢!#缓解
2021-03-14 21:01:04
我不明白为什么parameterLimit需要改变(无论如何它对我的情况没有帮助)。我没有发送任何参数,更不用说 1000(假设它是 URL 参数)
2021-03-30 21:01:04
添加“parameterLimit:50000”解决了这个问题。
2021-04-03 21:01:04
parameterLimit 是我遗漏的另一个问题,感谢您指出这一点。
2021-04-09 21:01:04

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

client_max_body_size 100M; #100mb
如何仅在快递中设置限制?
2021-03-11 21:01:04
@аlexdykyі 来自 Vivek22 的回答: app.use(bodyParser({limit: '50mb'}));
2021-03-23 21:01:04
谢谢!如果我没有发现这个答案,我会再寻找错误的解决方案 2 个小时
2021-03-30 21:01:04
这是我的问题,谢谢!一个线索是 nginx 的默认值是 1MB,所以如果你似乎被限制在这个数量上,那么它可能是 nginx。此外,另一个线索:body-parser 在错误对象中返回一个limit属性和一个length属性(以及status:413)。Nginx 不会这样做。因此,如果您在错误对象中看不到这些属性,则可能是 nginx 限制。这是更改此 nginx 设置的方法(最有可能在 中的配置文件/etc/nginx/sites-available/
2021-04-01 21:01:04
非常感谢你的回答,我相信这个答案应该得到支持,因为它很重要,我个人忘记了 nginx 配置......再次非常感谢你
2021-04-01 21:01:04

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

尝试:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
嗨 - 我正在使用以下内容: app.get('/api/0.1/people/', express.bodyParser({limit:'100mb'}), tracking.all); 我仍然收到同样的错误...
2021-03-21 21:01:04
默认限制是 100kbyte,因为现在看来 github.com/expressjs/body-parser#limit
2021-04-08 21:01:04

对于 express ~4.16.0,带有限制的 express.json 直接工作

app.use(express.json({limit: '50mb'}));
这是一个很好的解决方案,谢谢@Stenal P Jolly
2021-03-10 21:01:04
正确答案 。如果您使用 Express From 4.16.0 。它就像一个魅力。谢谢@Jolly
2021-03-27 21:01:04