PayloadTooLargeError:请求实体太大

Posted

技术标签:

【中文标题】PayloadTooLargeError:请求实体太大【英文标题】:PayloadTooLargeError: request entity too large 【发布时间】:2018-10-22 14:33:01 【问题描述】:

bodyParser 出现以下错误:

PayloadTooLargeError: request entity too large
at readStream (/root/server/node_modules/raw-body/index.js:155:17)
at getRawBody (/root/server/node_modules/raw-body/index.js:108:12)
at read (/root/server/node_modules/body-parser/lib/read.js:77:3)
at urlencodedParser (/root/server/node_modules/body-parser/lib/types/urlencoded.js:116:5)
at Layer.handle [as handle_request] (/root/server/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/root/server/node_modules/express/lib/router/index.js:317:13)
at /root/server/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/root/server/node_modules/express/lib/router/index.js:335:12)
at next (/root/server/node_modules/express/lib/router/index.js:275:10)
at jsonParser (/root/server/node_modules/body-parser/lib/types/json.js:118:7)
at Layer.handle [as handle_request] (/root/server/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/root/server/node_modules/express/lib/router/index.js:317:13)
at /root/server/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/root/server/node_modules/express/lib/router/index.js:335:12)
at next (/root/server/node_modules/express/lib/router/index.js:275:10)
at initialize (/root/server/node_modules/passport/lib/middleware/initialize.js:53:5)
at Layer.handle [as handle_request] (/root/server/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/root/server/node_modules/express/lib/router/index.js:317:13)
at /root/server/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/root/server/node_modules/express/lib/router/index.js:335:12)
at next (/root/server/node_modules/express/lib/router/index.js:275:10)
at jsonParser (/root/server/node_modules/body-parser/lib/types/json.js:118:7)

代码如下

const express = require("express");
const bodyParser = require('body-parser');

function setEntity(req, res) 
   // something....


module.exports = (app) => 

  const router = new express.Router();

  app.use(bodyParser.json(limit:'50mb'));
  app.use(bodyParser.urlencoded(
    extended: true
  ));

  router.use('/set/', (req, res) => 
    setEntity(req, res);
  );

  return router;
;

好像和this question很像

所以我尝试了这 3 个解决方案。

1.

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

2.

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

3.

app.use(bodyParser.json(limit:1024*1024*20, type:'application/json'));
app.use(bodyParser.urlencoded(extended:true,limit:1024*1024*20,type:'application/x-www-form-urlencoding' ));

但结果没有改变。

另一个设置如下所示

nginx has this setting : client_max_body_size 200M;
data size is under 500kb (json).
express : 4.15.3
body-parser : 1.18.2

我不知道为什么我不能更改限制数据大小。

【问题讨论】:

我在另一个文件中找到了 app.use(bodyParser.json());。我可以用这条线解决这个问题。谢谢。 【参考方案1】:

我的问题是因为我有 app.use(express.json()) 以及

app.use(bodyParser.json( limit: "50mb" ))

app.use(bodyParser.urlencoded( limit: "50mb", extended: true, parameterLimit: 50000 ))

我在删除app.use(express.json()) 后解决了它。希望它可以帮助遇到同样问题的人。

【讨论】:

第一种情况解决了我的问题。谢谢:)【参考方案2】:

控制最大请求正文大小可以解决问题,但是,您不再需要 body-parser。不要使用 body-parser 中间件,而是使用新的 Express 实现:

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

您可以找到here 的完整文档。

【讨论】:

我已经离开bodyParser,但是像这样的小洞需要填补。感谢您帮助填补空白!【参考方案3】:

它们都不适合我,我无法通过编写这些来更改限制

app.use(express.urlencoded( limit: "50mb", extended: true, parameterLimit: 50000 ))
app.use(express.json( limit: "50mb", extended: true, parameterLimit: 50000 ))

您可以从 node_modules\body-parser\lib\types\json.js

更改限制
? bytes.parse(opts.limit || '100kb') to  ? bytes.parse(opts.limit || '50mb')

【讨论】:

【参考方案4】:

感谢它确实有效

app.use(bodyParser.urlencoded( limit: "50mb", extended: true, parameterLimit: 50000 ))

我在删除app.use(express.json()) 后解决了这个问题。希望它可以帮助遇到同样问题的人。

【讨论】:

嗨,欢迎来到 ***。太好了,您找到了答案!下次把你的代码放在一个代码块中,这样更容易阅读

以上是关于PayloadTooLargeError:请求实体太大的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore onSnapshot PayloadTooLargeError:Expo / React Native 项目上的请求实体太大

PayloadTooLargeError: request entity too large错误解决

仅请求实体的一个属性

Android httpclient 请求和实体处理

响应:413 请求实体太大

请求实体太大(JasperServer / Apache / Tomcat)