错误:请求实体太大

2020/09/25 05:41 · javascript ·  · 0评论

我收到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

我正在使用meanstack。我的express.js中有以下使用声明

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

在提琴手中,我可以看到content-length标头,其值为:1078702

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

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

我最近遇到了相同的错误,发现的所有解决方案均无效。

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

当添加一个console.log('Limit file size: '+limit);in node_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重置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

如果您未运行相同版本的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模块而不是express.json()and express.urlencoded()并使用其and 方法,如下所示: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'}));

就我而言,仅添加以下行是不够的:

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

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

client_max_body_size 100M; #100mb

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

尝试:

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

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

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

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

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

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

对于Express〜4.16.0,带有limit的express.json直接起作用

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

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

client_max_body_size 5M;

重新启动Nginx,问题消失了

sudo systemctl restart nginx

我使用了依赖关系的方法来解决这个问题。

例:

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

小老帖子,但我有同样的问题

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

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

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

我们自己的经验

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

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

我已经评论了这一行

app.use(bodyParser.json());

我把

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

然后就可以了

以下代码段对我来说解决了问题。

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

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

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

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

我也遇到了这个问题,我在重复app.use(bodyParser.json())下面的步骤,这是一个愚蠢的错误

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

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

如果您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 }));

对我来说,主要诀窍是

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

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

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

本文地址:http://javascript.askforanswer.com/cuowuqingqiushititaida.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!