【问题标题】:Error: request entity too large错误:请求实体太大
【发布时间】:2013-11-23 21:45:53
【问题描述】:

我收到以下快递错误:

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 我认为您应该将其添加为答案,虽然它当然不适用于所有人,但这正是发生在我身上的事情,荣誉。

标签: javascript node.js http express


【解决方案1】:

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

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

node_modules/express/node_modules/connect/lib/middleware/json.js:46 中添加console.log('Limit file size: '+limit); 并重新启动节点时,我在控制台中得到以下输出:

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

然后我在node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10 中添加了console.log('Limit file size: '+limit);,并在调用具有大请求的路由时在控制台中看到了另一行(在错误输出之前):

Limit file size: 1048576

这意味着不知何故,connect 重置了限制参数并忽略了我们指定的内容。我尝试在路由定义中单独指定bodyParser 参数,但也没有运气。

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

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

关于这个问题我已经打开an issue on their 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'}));

如果您需要分段(用于文件上传),请参阅this post

[第二次编辑]

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

如果没有为bodyParser.urlencoded() 明确定义extended 选项,它将引发警告(body-parser deprecated undefined extended: provide extended option)。这是因为在下一版本中将需要此选项,并且将不再成为可选选项。有关extended 选项的更多信息,您可以参考body-parserreadme

[第三次编辑]

似乎在 Express v4.16.0 之后,我们可以回到最初的做法(感谢@GBMan 的提示):

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

【讨论】:

  • 我的问题是我的 bodyParser 上方有 express.json() 解析器......在了解了它是如何工作的之后,我删除了 bodyParser 并在另一个中设置了 delimit,比如app.use(express.json({limit:'50mb'}));。我编辑了我的答案以反映这一点!
  • 对于 express 4,指示的代码在 urlencoded 调用上抛出“body-parser deprecated undefined extended: provide extended option”
  • 感谢您为 express 4 更新此内容。您是救生员!
  • 这与此答案一样全面,因此,如果您在 node.js/express 实例前使用 nginx 作为反向代理,我还遇到了一点供将来参考,这也是推荐的做法。 Nginx 会抛出同样的413::Request Entity is too large 异常。它不会将请求转发到您的快速应用程序。所以我们需要在 nginx 配置中设置 client_max_body_size 50M; 或者一个特定的服务器配置或者甚至一个特定的位置标签都可以工作。
  • 感谢塞缪尔!将我从头痛的世界中拯救出来,为全面的答案干杯和 +1!
【解决方案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 是我遗漏的另一个问题,感谢您指出这一点。
  • 添加“parameterLimit:50000”即可解决问题。
  • 在找到这个答案之前,我一直在努力解决这个问题。谢谢! #缓解
  • 我不明白为什么parameterLimit 需要更改(无论如何对我的情况没有帮助)。我没有发送任何参数,更不用说 1000(假设它是 URL 参数)
【解决方案3】:

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

client_max_body_size 100M; #100mb

【讨论】:

  • 这是我的问题,谢谢!一个线索是 nginx 的默认值是 1MB,所以如果你似乎被限制在这个数量,那么它可能是 nginx。另外,还有一条线索:body-parserwill returnlimitproperty 和length 错误对象中的属性(以及status:413)。 Nginx 不这样做。因此,如果您在错误对象中看不到这些属性,则可能是 nginx 限制。 Here's如何改变这个nginx设置(配置文件最有可能在/etc/nginx/sites-available/
  • 非常感谢你的回答我相信这个答案应该被赞成,因为它很重要,我个人忘记了 nginx 配置......再次非常感谢
  • 如何只在快递中设置限制?
  • @аlexdykyі 来自 Vivek22 的回答:app.use(bodyParser({limit: '50mb'}));
  • 谢谢!如果我没有发现这个我认为的答案,我会再追逐错误的解决方案 2 小时
【解决方案4】:

我不认为这是明确的全局大小限制,而是特别是 connect.json middleware limit。当您使用 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);我仍然收到同样的错误...
  • 默认限制是 100kbyte,就像现在一样 github.com/expressjs/body-parser#limit
【解决方案5】:

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

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

【讨论】:

  • 正确答案。如果您使用 Express From 4.16.0 。它就像一个魅力。谢谢@Jolly
  • 这是一个很好的解决方案,感谢@Stenal P Jolly
【解决方案6】:

在我的情况下 .. 设置 parameterLimit:50000 解决了问题

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

【讨论】:

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

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

【讨论】:

  • 是的,这也是我需要做的。它已经设置好,因此您可以从您的应用脚本驱动配置设置。
  • 您是指application/x-www-form-urlencoded(而不是application/x-www-form-urlencoding)吗?
  • 根据 Express 4 文档 (expressjs.com/en/api.html#express.urlencoded),“application/x-www-form-urlencoded”已经是默认值了。
【解决方案8】:

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

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());在我之前的代码中,实际上,只有第一个被采用!
【解决方案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'}))
    

    然后就可以了

    【讨论】:

    • 谢谢,这正是我需要的!
    【解决方案11】:

    下面的设置对我有用

    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;
    

    【讨论】:

      【解决方案12】:

      一种稍微不同的方法 - 负载太大

      到目前为止,所有有用的答案都与增加有效负载限制有关。但也可能是有效载荷确实太大但没有充分理由的情况。如果没有正当理由,请首先考虑调查它为何如此臃肿。

      我们自己的经验

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

      【讨论】:

      • 有时数据量很大。就我而言,我只需要半兆
      • 这与有时没有的事实并不矛盾:)
      【解决方案13】:

      有点旧的帖子,但我遇到了同样的问题

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

      【讨论】:

        【解决方案14】:

        我已经使用另一种实践来解决 multer 依赖的这个问题。

        例子:

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

        【讨论】:

          【解决方案15】:

          将以下配置传递给您的服务器以增加您的请求大小。

          app.use(express.json({ extended: false, limit: '50mb' }))
          app.use(express.urlencoded({ limit: '50mb', extended: false, parameterLimit: 50000 }))
          

          【讨论】:

            【解决方案16】:

            对我来说,跟随 sn-p 解决了问题。

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

            【讨论】:

              【解决方案17】:

              在尝试了这篇文章中的所有内容后,我没有成功。但我找到了一个适合我的解决方案。 我能够在不使用 body-parser 并且仅使用 express 的情况下解决它。 它看起来像这样:

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

              不要忘记使用 extended: true 从控制台中删除已弃用的消息。

              【讨论】:

                【解决方案18】:

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

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

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

                【讨论】:

                  【解决方案19】:

                  在我的情况下,从请求标头中删除 Content-type 是可行的。

                  【讨论】:

                    【解决方案20】:

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

                    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 Payload Too Large 响应状态代码表示 请求实体大于服务器定义的限制;服务器 可能会关闭连接或返回 Retry-After 标头字段。

                    【讨论】:

                      【解决方案21】:

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

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

                      【讨论】:

                        【解决方案22】:

                        如果您同时使用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 }));
                        

                        【讨论】:

                          【解决方案23】:

                          Express 4.17.1

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

                          Demo csb

                          【讨论】:

                            【解决方案24】:

                            以下代码解决了我的问题:

                            var bodyParser = require('body-parser');
                            var urlencodedParser = bodyParser.urlencoded({ extended: false, limit: '5mb' });
                            

                            【讨论】:

                              【解决方案25】:

                              对我来说,主要技巧是

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

                              bodyParse.json 首先 bodyParse.urlencoded 秒

                              【讨论】:

                                【解决方案26】:

                                对于那些在 IIS 下在 Azure 中启动 NodeJS 应用程序的人,不要忘记按照此处的说明修改 web.config Azure App Service IIS "maxRequestLength" setting

                                【讨论】:

                                  猜你喜欢
                                  • 2016-08-05
                                  • 2016-02-10
                                  • 2016-02-01
                                  • 2018-12-14
                                  • 1970-01-01
                                  • 2019-03-17
                                  • 2016-07-16
                                  • 2017-03-05
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多