繁体   English   中英

错误:请求实体太大

[英]Error: request entity too large

我收到以下快递错误:

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 中,我可以看到内容长度 header,其值为:1078702

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

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

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

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

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

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,请在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 中,您必须要求body-parser模块并使用其json()urlencoded()方法,而不是express.json()express.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 之后,我们可以 go 回到最初的执行方式(感谢@GBMan 的提示):

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

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

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

如文档所述,我尝试在 urlencoded function 上添加 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}));

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

client_max_body_size 100M; #100mb

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

尝试:

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

对于 express ~4.16.0,express.json 直接工作

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

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

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

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

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

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

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

client_max_body_size 5M;

重启 Nginx 问题就消失了

sudo systemctl restart nginx

下面的设置对我有用

快递 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;

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

我已经评论了这一行

app.use(bodyParser.json());

我把

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

然后它工作

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

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

我们自己的经历

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

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

使用 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(express.json({ extended: false, limit: '50mb' }))
app.use(express.urlencoded({ limit: '50mb', extended: false, parameterLimit: 50000 }))

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

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

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

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

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

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

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

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

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

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

 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 header 字段。

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

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})) 中传递限制参数,则此条件通过。

只需添加这一行必须实际解决它

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

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

快递 4.17.1

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

演示 csb

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

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

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

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

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

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

在此处输入图像描述

对我来说,主要技巧是

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

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

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

For those who start the NodeJS app in Azure under IIS, do not forget to modify web.config as explained here Azure App Service IIS "maxRequestLength" setting

我正在使用 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 最大文件 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 限制的文件时,您将遇到 4 13 错误

通过编辑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 中的限制文件上传大小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM