错误:请求实体太大

mik*_*mes 416 javascript http node.js 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
Run Code Online (Sandbox Code Playgroud)

我正在使用meanstack.我在express.js中有以下用法语句

//Set Request Size Limit
app.use(express.limit(100000000));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*duc 903

我最近遇到了同样的错误,我找到的所有解决方案都没有用.

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

添加console.log('Limit file size: '+limit);in node_modules/express/node_modules/connect/lib/middleware/json.js:46和restarting节点时,我在控制台中获得此输出:

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
Run Code Online (Sandbox Code Playgroud)

我们可以看到,首先,加载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
Run Code Online (Sandbox Code Playgroud)

这意味着在某种程度上,某处,connect重置limit参数并忽略我们指定的内容.我尝试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
Run Code Online (Sandbox Code Playgroud)

如果您不运行相同版本的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'}));
Run Code Online (Sandbox Code Playgroud)

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

第二次编辑

请注意,在Express 4中,而不是express.json()express.urlencoded(),您必须要求body-parser模块并使用它json()urlencoded()方法,如下所示:

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

如果extended未明确定义该选项bodyParser.urlencoded(),则会抛出警告(body-parser deprecated undefined extended: provide extended option).这是因为在下一个版本中将需要此选项,并且不再是可选的.有关更多信息extended选项,请参阅自述body-parser.

  • 这和这个答案一样全面,所以如果你在node.js/express实例前面使用nginx作为反向代理,我还会再遇到一个问题.这也是推荐的做法.Nginx将抛出相同的`413 :: Request Entity太大`异常.它不会将请求转发给您的快递应用程序.所以我们需要在nginx配置中设置`client_max_body_size 50M;`或者特定的服务器配置,或者甚至特定的位置标签都可以. (32认同)
  • 我的问题是我在bodyParser上面有express.json()解析器...在理解了它是如何工作之后我删除了bodyParser并在另一个中设置了de限制,比如`app.use(express.json({limit:'50mb "}));`.我编辑了我的答案以反映这一点! (7认同)
  • 感谢您为快递4更新此信息.您是一个节省生命的人! (3认同)
  • 谢谢塞缪尔这个!保存我从一个头痛的世界,干杯和+1全面的答案! (3认同)
  • 对于express 4,指示的代码在`urlencoded`调用上抛出"body-parser deprecated undefined extended:提供扩展选项" (2认同)

slo*_*nzo 96

我使用Express 4.

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

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

我尝试在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}));
Run Code Online (Sandbox Code Playgroud)

  • 添加“parameterLimit:50000”解决了这个问题。 (3认同)
  • 在找到这个答案之前,我一直在努力解决这个问题。谢谢你!#缓解 (3认同)

Ale*_*der 40

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

client_max_body_size 100M; #100mb
Run Code Online (Sandbox Code Playgroud)

  • 这是我的问题,谢谢!一个线索是nginx的默认值是1MB,所以如果你似乎被限制在那个数量,那么它可能是nginx.另外,另一个线索:`body-parser` [将返回](https://github.com/expressjs/body-parser#request-entity-too-large)一个`limit`property和一个`length`属性错误对象(以及`status:413`).Nginx不会这样做.因此,如果您无法在错误对象中看到这些属性,则可能是nginx限制.[这里](/sf/answers/1870206691/)如何更改此nginx设置(最有可能在`/ etc/nginx/sites-available /`中的配置文件) (3认同)
  • 非常感谢你的回答我相信这个答案应该被赞成,因为它很重要,我个人忘记了nginx配置...再次非常感谢你 (2认同)

Pet*_*ons 28

我认为这不是明确的全局大小限制,而是具体的connect.json中间件限制.默认情况下,当您使用express.bodyParser()并且不提供limit选项时,这是100kb .

尝试:

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

  • @ShadowGames,最上面的答案有一个部分详细介绍了使用 body-parser npm 包对 Express 4 进行的更新,该包现在是一个独立的单独包。/sf/answers/1397556261/ (2认同)

小智 16

下面的设置对我有用

快递4.16.1

app.use(bodyParser.json({ limit: '50mb' }))
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: false,
}))
Run Code Online (Sandbox Code Playgroud)

nginx

client_max_body_size 50m;
client_body_temp_path /data/temp;
Run Code Online (Sandbox Code Playgroud)


Yil*_*maz 13

此问题发生在两种情况下:

1-请求正文太大,服务器无法处理这么大的数据。这会为它服务

app.use(express.json({limit: '50mb'}));
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


小智 12

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

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

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

use*_*076 11

2016年,除了bodyparser的'limit'之外,除了明确设置'type'之外,以上都没有为我工作,例如:

  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);
Run Code Online (Sandbox Code Playgroud)

  • 您是说“ application / x-www-form-urlencoded”(而不是“ application / x-www-form-urlencoding”)吗? (2认同)

Boa*_*oaz 11

稍微不同的方法 - 有效负载太大

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

我们自己的经验

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


Aka*_*nja 10

只需添加这一行就可以实际解决它

app.use(express.json({limit: '50mb'}));
Run Code Online (Sandbox Code Playgroud)

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


Viv*_*k22 9

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

app.use(bodyParser({limit: '50mb'}));
Run Code Online (Sandbox Code Playgroud)

而已.

尝试以上所有,没有工作.发现即使我们使用如下,

app.use(bodyParser());
app.use(bodyParser({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb'}));
Run Code Online (Sandbox Code Playgroud)

只有第app.use(bodyParser());一个被定义,后两个被忽略.

参考:https://github.com/expressjs/body-parser/issues/176 >>参见'dougwilson于2016年6月17日发表评论'


小智 9

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

client_max_body_size 5M;
Run Code Online (Sandbox Code Playgroud)

重启 Nginx 问题就解决了

sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)


Mau*_*tel 8

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

我已经评论了这一行

app.use(bodyParser.json());
Run Code Online (Sandbox Code Playgroud)

我把

app.use(bodyParser.json({limit: '50mb'}))
Run Code Online (Sandbox Code Playgroud)

然后它工作


小智 7

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

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


Gri*_*R1P 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);
        });
    });
};
Run Code Online (Sandbox Code Playgroud)


小智 6

对于Express〜4.16.0,具有limit的express.json可直接工作

app.use(express.json({limit: '50mb'}));
Run Code Online (Sandbox Code Playgroud)


car*_*kod 6

就我而言,Content-type从请求标头中删除是有效的。


Pro*_*ton 6

添加到亚历山大的答案

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

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

通过编辑client_max_body_size,您可以调整文件上传大小。使用http、、serverlocation块进行编辑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

}
Run Code Online (Sandbox Code Playgroud)

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


Que*_*guy 5

我已经使用另一种做法来解决这个问题的 multer Dependancie。

例子:

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);
};
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你同时使用express.json()bodyParser ,它会给出错误,因为express设置了它自己的限制。

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
Run Code Online (Sandbox Code Playgroud)

删除上面的代码,只添加下面的代码

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


小智 5

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

const express = require('express');    

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

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


小智 5

为我工作:

配置 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 }));
Run Code Online (Sandbox Code Playgroud)