错误:请求实体太大

我收到以下快递错误:

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

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

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

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

604613 次浏览

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

尝试:

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

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

经过一番挖掘,我发现设置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参数,但也没有运气。

虽然我没有找到任何适当的方法来永久设置它,但您可以直接在模块中“补丁”它。如果您使用的是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移到它上面就成功了。

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

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

如果您需要多部分(用于文件上传),请参阅这篇文章

[第二次编辑]

请注意,在Express 4中,而不是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-parser自述文件

[第三次编辑]

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

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

我已经用另一个实践来解决这个问题,有多个依赖项。

示例:

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

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

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

我尝试在urlencoded函数上添加参数限制选项,因为留档说,错误不再出现。

参数限制选项控制参数的最大数量 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年,上述方法都不适用于我,直到我明确设置了“类型”和“限制”,例如:

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

在我的情况下…设置parameterLimit:50000修复了问题

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

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

client_max_body_size 100M; #100mb

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

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

以下内容对我有用…只需使用

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日'

略有不同的方法-有效载荷为太大

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

我们自己的经验

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

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

我评论了这条线

app.use(bodyParser.json());

然后我把

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

那就成功了

在我的情况下,问题出在nginx配置上。要解决它,我必须编辑文件:/etc/nginx/nginx.conf并在服务器块中添加以下行:

client_max_body_size 5M;

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

sudo systemctl restart nginx

对于快递~4.16.0,带极限的express.json直接工作

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

对我来说,主要的诀窍是

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


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

bodyParse.json第一 bodyParse.urlencoded秒

更好的使用,您可以指定文件大小的限制,因为它显示在给定的行中:

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

您也可以在node-模块主体解析器中更改默认设置,然后在lib文件夹中,有JSON和文本文件。然后在这里更改限制。实际上,如果您在给定行中不传递限制参数,此条件会通过 app.use(bodyParser.json({限制:'10mb',扩展:true}))。

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

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

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

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

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

在我的例子中,从请求标头中删除Content-type是有效的。

如果你同时使用express.json()身体解析器,它会给出错误,因为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 }));

对于那些在IIS下在Azure中启动NodeJS应用程序的人,不要忘记修改web.config,如下所述Azure应用服务IIS“最大请求长度”设置

我最近遇到了同样的问题,波纹管解决方案为我工作。

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

理解: HTTP431

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

Express 4.17.1

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

演示csb

下面的设置已为我工作

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;

在尝试了这篇文章中的所有内容后,我没有成功。但我找到了一个对我有效的解决方案。 我能够在不使用身体解析器并且仅使用表达的情况下解决它。 它看起来像这样:

const express = require('express');


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

不要忘记使用扩展:真从控制台中删除不建议使用的消息。

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

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

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

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

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

为我工作:

配置nginx max文件zise [https://patriciahillebrandt.com/nginx-413-request-entity-too-large/][1]

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

添加到亚历山大的回答

默认情况下,NGINX的每个文件上传限制为1 MB。通过限制上传的文件大小,您可以防止某些类型的拒绝服务(DOS)攻击和许多其他问题。

因此,当您尝试上传超过1MB限制的文件时,您将遇到413错误

通过编辑client_max_body_size,您可以调整文件上传大小。使用httpserverlocation块编辑client_max_body_size

server {
server_name example.com;


location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


proxy_pass http://127.0.0.1:8080;
client_max_body_size 20M;
}


listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/infohob.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/infohob.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}

参考限制NGINX中的文件上传大小

只要加上这一行就可以解决问题

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

还建议你们将整个图像发送到后端,然后进行转换,而不是从前端发送数据

这个问题发生在两种情况下:

1-请求主体太大,服务器无法处理这个大数据。这将为它服务

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

2-req.cookies太大。在同一浏览器上测试不同的next.js应用程序时,如果正在运行一些应用程序,每次每个应用程序都在不同的端口上启动。同一个应用程序最终可能会从3000-3005端口开始。这意味着如果您的应用程序保存cookie,则该cookie将被保存到每个端口。假设您在localhost:3000启动了5个不同的应用程序,每个应用程序都保存了一个cookie。如果您发出请求,所有cookie都将附加到请求对象,在这种情况下,您将无法处理即使是post.body的小尺寸。解决方案是您必须删除所有cookie

输入图片描述