如何修复 Node.js 中的“413 请求实体太大”错误

Posted

技术标签:

【中文标题】如何修复 Node.js 中的“413 请求实体太大”错误【英文标题】:How to fix '413 Request Entity Too Large' error in Node.js 【发布时间】:2019-06-14 09:08:37 【问题描述】:

我正在尝试允许用户将多张图片上传到我的网站,然后这些图片将作为附件通过电子邮件发送给所有用户,但我遇到了一个错误,指出文件太大。

我使用 Mailgun 发送邮件,使用 Cloudinary 上传/存储图像,使用 MongoDB 作为我的数据库,使用 request.js 请求图像,使用 Cloud 9 进行开发,使用 Node.js/Express 作为我的后端。

用户进程是这样​​的:

用户向网站提交图片 图片通过 Cloudinary 上传,每张图片的直接链接保存在 MongoDB 数据库中 邮件通过 Mailgun 发出,以通知用户新帖子以及添加为附件的图像

我正在使用 request.js 从 Cloudinary 请求图像,然后将每个图像推送到一个数组中,然后将其添加为 Mailgun 的附件参数。

这适用于较小的图像,但当用户上传大量高质量图像时,我会收到错误消息。

我尝试将 100MB 的文件大小限制添加到 Multer、bodyParser.json 和 bodyParser.urlencoded 以及 100MB 的参数限制。

var upload = multer( storage: storage, fileFilter: imageFilter, limits: fileSize: 100000000);

app.use(bodyParser.json(limit: "100mb", parameterLimit: 100000000));
app.use(bodyParser.urlencoded(limit: '100mb', extended: true, parameterLimit: 100000000));

var images = [];
post.images.forEach(function(photo)
    images.push(request(photo));
);

var data =  
    from: "email <email@email.com>",
    to: "email@email.com",
    subject: 'this is an email',
    html: 'this is an email',
    attachment: images
;

预期的结果是发送成功的电子邮件,并附有所有图像。

实际结果是这个错误信息:

 Error: <html>
<head><title>413 Request Entity Too Large</title></head>
<body bgcolor="white">
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx</center>
</body>
</html>

at IncomingMessage.res.on (/home/ubuntu/workspace/TW/node_modules/mailgun-js/lib/request.js:319:17)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9) statusCode: 413 

【问题讨论】:

似乎错误来自 nginx,所以请求可能永远不会到达您的节点服务器? @schu34 我可以给 nginx 添加限制吗?我以前从未听说过。 这可以帮助***.com/questions/34382890/… 如果问题是ngInx,那么配置文件应该是/etc/nginx/nginx.conf。此链接也可以提供帮助:***.com/questions/24306335 @paulsm4 感谢您的帮助!我已经编辑了 nginx.conf 并重新启动了我的工作区,但仍然弹出错误。也许我编辑不正确?这是我的 http 部分的样子i.imgur.com/7eu0gy3.png 【参考方案1】:

这里的问题似乎是你有一个 Nginx 服务器在你的节点前面运行,它的默认大小限制很小。请参阅此问题了解如何设置大小限制:Hardcode header size limit / timeout values in Nginx

【讨论】:

我将如何在 Cloud 9 中执行此操作?我已经查找了 nginx.conf 文件,但找不到。【参考方案2】:

问题最终根本不是 nginx,我试图通过 Mailgun 将图像作为附件通过电子邮件发送,并且硬限制为 25MB。

在用户可以上传图片的部分编辑此行后,一切正常:

let result = await cloudinary.v2.uploader.upload(file.path, width: 1280, height: 720, crop: "limit");

【讨论】:

以上是关于如何修复 Node.js 中的“413 请求实体太大”错误的主要内容,如果未能解决你的问题,请参考以下文章

自托管 WCF 服务中的 HTTP 413 请求实体太大

响应:413 请求实体太大

413请求实体太大

(413) 使用 WCF 请求实体太大错误

413 请求实体太大 nginx django

413 请求实体太大 IIS 10