663

我收到以下快递错误:

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

我正在使用平均堆栈。我的 express.js 中有以下使用语句

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

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

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

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

4

27 回答 27

1340

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

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

添加console.log('Limit file size: '+limit);innode_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单独指定路由定义中的参数,但也没有运气。

虽然我没有找到任何适当的方法来永久设置它,但您可以直接在模块中“修补”它。如果您使用的是 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模块并使用它的and方法,而不是express.json()and ,如下所示: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'}));
于 2013-11-13T21:48:58.507 回答
163

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

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}));
于 2016-04-09T08:05:46.093 回答
66

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

client_max_body_size 100M; #100mb
于 2016-11-22T15:20:34.437 回答
39

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

尝试:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
于 2013-11-11T23:47:47.660 回答
22

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

app.use(express.json({limit: '50mb'}));
于 2019-01-14T08:42:39.153 回答
19

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

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
于 2016-05-16T12:11:45.407 回答
16

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);
于 2016-05-06T20:42:04.983 回答
14

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

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

于 2017-03-03T20:15:22.680 回答
12

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

client_max_body_size 5M;

重新启动 Nginx,问题就消失了

sudo systemctl restart nginx
于 2018-09-18T08:33:56.743 回答
9

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

我已经评论了这一行

app.use(bodyParser.json());

我把

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

然后它工作

于 2018-09-18T04:17:04.197 回答
8

下面的设置对我有用

快递 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;
于 2020-12-24T07:26:10.330 回答
7

一种稍微不同的方法 - 有效载荷太大

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

我们自己的经历

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

于 2018-06-10T09:08:56.267 回答
6

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

使用 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);
        });
    });
};
于 2017-01-11T07:48:37.540 回答
5

对于 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);
};
于 2016-03-16T10:44:48.870 回答
5

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

app.use(express.json({ extended: false, limit: '50mb' }))
app.use(express.urlencoded({ limit: '50mb', extended: false, parameterLimit: 50000 }))
于 2021-06-08T12:27:10.813 回答
4

对我来说,下面的片段解决了这个问题。

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'})); 
于 2019-06-20T17:21:13.257 回答
4

在尝试了这篇文章中的所有内容后,我没有成功。但我找到了一个适合我的解决方案。我能够在不使用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从控制台中删除已弃用的消息。

于 2021-04-29T19:47:50.660 回答
3

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

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

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

于 2019-08-02T06:03:54.733 回答
3

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

于 2019-09-17T04:56:40.983 回答
3

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

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 标头字段。

于 2020-10-01T19:14:49.280 回答
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})) 中传递限制参数,则此条件通过。

于 2019-05-24T14:36:01.840 回答
2

如果您同时使用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 }));
于 2020-04-15T12:37:47.007 回答
1

快递 4.17.1

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

演示 csb

于 2020-12-17T16:19:56.607 回答
1

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

var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false, limit: '5mb' });
于 2021-11-11T14:16:50.253 回答
0

对我来说,主要技巧是

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

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

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

于 2019-02-18T17:58:39.093 回答
0

对于那些在 IIS 下在 Azure 中启动 NodeJS 应用程序的人,请不要忘记修改 web.config,如Azure App Service IIS "maxRequestLength" 设置中所述

于 2020-10-01T14:32:45.343 回答
0

我正在使用 multer 将文件上传到 AWS s3。对我来说,添加client_max_body_size 100M;到 nginx 文件后,出现 400 错误。(但是 413 错误消失了,这意味着它成功通过了 nginx 并到达了你的服务器)

解决方案如下: https ://stackoverflow.com/a/71240419/15477963

我的 app.js 文件不需要更改,并且保持这样,它的工作原理:

const express = require('express');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
于 2022-02-23T16:13:45.047 回答