错误:请求实体太大

新手上路,请多包涵

我收到以下快递错误:

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

在提琴手中,我可以看到内容长度标头的值为:1078702

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

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

原文由 mike james 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 569
2 个回答

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

经过一番挖掘,我发现设置 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 重置了限制参数并忽略了我们指定的内容。我尝试在路由定义中单独指定 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 之后,我们可以回到最初的做法(感谢@GBMan 的提示):

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

原文由 Samuel Bolduc 发布,翻译遵循 CC BY-SA 4.0 许可协议

在我的例子中,添加这些行是不够的:

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

原文由 saeta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题