错误:请求实体太大

时间:2013-11-11 22:40:26

标签: javascript node.js http 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));

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

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

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

24 个答案:

答案 0 :(得分:812)

我最近遇到了同样的错误,我找到的所有解决方案都无效。

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

console.log('Limit file size: '+limit);中添加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,请在node_modules/express/node_modules/connect/lib/middleware/json.js的第46行添加:

limit = 52428800; // for 50mb, this corresponds to the size in bytes

如果您不运行相同版本的Express,则行号可能会有所不同。 请注意,这是不良做法,如果您更新模块,则会覆盖

所以这个临时解决方案现在有效,但是一旦找到解决方案(或者模块已修复,以防模块出现问题),您应该相应地更新代码。

我已就这个问题打开了an issue on their GitHub

[编辑 - 找到解决方案]

经过一些研究和测试后,我发现在调试时,我添加了app.use(express.bodyParser({limit: '50mb'}));,但后添加了 app.use(express.json());。然后,Express会将全局限制设置为1mb,因为他在运行脚本时遇到的第一个解析器是express.json()。移动bodyParser就可以了。

也就是说,{3.0}中的bodyParser()方法将被弃用,不应使用。相反,您应该明确声明您的解析器,如下所示:

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

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

第二次修改

请注意,在Express 4中,您必须使用body-parser模块并使用其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}));

如果没有为extended明确定义bodyParser.urlencoded()选项,则会发出警告(body-parser deprecated undefined extended: provide extended option)。这是因为在下一个版本中将需要此选项,将再次成为可选项。有关extended选项的详情,请参阅body-parser的{​​{3}}。

答案 1 :(得分:84)

我使用Express 4。

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

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

答案 2 :(得分:37)

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

client_max_body_size 100M; #100mb

答案 3 :(得分:28)

我认为这不是明确的全球规模限制,而是具体的connect.json middleware limit。默认情况下,当您使用express.bodyParser()并且未提供limit选项时,此值为100kb。

尝试:

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

答案 4 :(得分:11)

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

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

答案 5 :(得分:9)

2016年,在我明确设定&#39;类型&#39;之前,以上都不适用于我。除了限制&#39;对于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-urlencoding' })

  app.use(jsonParser);
  app.use(urlencodedParser);

答案 6 :(得分:7)

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

即可
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&gt;&gt;见&#39; dougwilson于2016年6月17日评论&#39;

答案 7 :(得分:4)

对于Express〜4.16.0,具有限制的express.json直接起作用

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

答案 8 :(得分:4)

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

我已经评论了这一行

app.use(bodyParser.json());

我放

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

然后它起作用

答案 9 :(得分:4)

小老帖但我有同样的问题

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

答案 10 :(得分:3)

略有不同的方法 - 有效负载太BIG

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

我们自己的经验

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

答案 11 :(得分:3)

我使用multer dependancie来解决这个问题。

示例:

<LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="370dp"
  android:orientation="horizontal"
  android:id="@+id/invitememberLayout4"
  android:weightSum="3">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Invite Member"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="80dp"
    android:layout_alignTop="@+id/createteamLayout2"
    android:id="@+id/invitebtn"
    android:onClick="onInviteMember"
    android:layout_weight="1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Done"
    android:id="@+id/Donebtn"
    android:onClick="onDonebtn"
    android:layout_gravity="right"
    android:layout_weight="1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Exit"
    android:id="@+id/Exitbtn"
    android:onClick="onExitbtn"
    android:layout_weight="1"/>

</LinearLayout>

答案 12 :(得分:2)

就我而言,问题出在 Nginx配置上。为了解决这个问题,我必须编辑文件:Get-ADUser -Filter {Name -eq "USERNAME"} 并将此行添加到服务器块中:

/etc/nginx/nginx.conf

重启Nginx,问题消失了

client_max_body_size 5M;

答案 13 :(得分: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 }));

答案 14 :(得分:1)

我也面临这个问题,我通过重复如下的app.use(bodyParser.json())犯了一个愚蠢的错误:

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

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

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

答案 18 :(得分:0)

对我来说,主要诀窍是

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

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

bodyParse.json首先 bodyParse.urlencoded秒

答案 19 :(得分:0)

最好使用指定行中显示的文件大小限制

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

您还可以在node-modules body-parser中更改默认设置,然后在lib文件夹中包含JSON和文本文件。然后在此处更改限制。实际上,如果您未在给定行中传递limit参数,则此条件通过 app.use(bodyParser.json({limit:'10mb',extended:true}))。

答案 20 :(得分:0)

以下片段对我来说

解决了问题。 var bodyParser = require('body-parser'); app.use(bodyParser.json({limit:'50mb'}));

答案 21 :(得分:0)

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

答案 22 :(得分:0)

对于那些在IIS下在Azure中启动NodeJS应用的用户,请不要忘记按照此处Azure App Service IIS "maxRequestLength" setting

的说明修改web.config。

答案 23 :(得分:0)

Express 4.17.1

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

Demo csb