如何修复 Node.js 中的“413 请求实体太大”错误
How to fix '413 Request Entity Too Large' error in Node.js
我试图让用户上传多张图片到我的网站,然后这些图片将作为附件通过电子邮件发送给所有用户,但我遇到了一个错误,指出文件太大。
我正在使用 Mailgun 发送邮件,Cloudinary upload/store 图片,MongoDB 作为我的数据库,request.js 请求图片,Cloud 9 开发,以及Node.js/Express 作为我的后端。
用户进程是这样的:
- 用户将图片提交到网站上
- 图片通过Cloudinary上传,每张图片的直接link保存在MongoDB数据库
- 邮件通过 Mailgun 发出以通知用户新的 post 并将图像添加为附件
我正在使用 request.js 从 Cloudinary 请求图像,然后将每个图像推送到一个数组中,然后将其添加为 Mailgun 的附件参数。
这适用于较小的图像,但当用户上传大量高质量图像时,我会收到错误消息。
我已尝试为 Multer、bodyParser.json 和 bodyParser.urlencoded 添加 100MB 的文件大小限制以及 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 }
这里的问题似乎是您的节点 1 前面有一个 Nginx 服务器 运行,它的默认大小限制很小。请参阅此问题以了解如何设置大小限制:Hardcode header size limit / timeout values in Nginx
问题最终不是 nginx,我试图通过 Mailgun 将图像作为附件通过电子邮件发送,并且硬性限制为 25MB。
在用户可以上传图片的部分编辑此行后一切正常:
let result = await cloudinary.v2.uploader.upload(file.path, {width: 1280, height: 720, crop: "limit"});
我试图让用户上传多张图片到我的网站,然后这些图片将作为附件通过电子邮件发送给所有用户,但我遇到了一个错误,指出文件太大。
我正在使用 Mailgun 发送邮件,Cloudinary upload/store 图片,MongoDB 作为我的数据库,request.js 请求图片,Cloud 9 开发,以及Node.js/Express 作为我的后端。
用户进程是这样的:
- 用户将图片提交到网站上
- 图片通过Cloudinary上传,每张图片的直接link保存在MongoDB数据库
- 邮件通过 Mailgun 发出以通知用户新的 post 并将图像添加为附件
我正在使用 request.js 从 Cloudinary 请求图像,然后将每个图像推送到一个数组中,然后将其添加为 Mailgun 的附件参数。
这适用于较小的图像,但当用户上传大量高质量图像时,我会收到错误消息。
我已尝试为 Multer、bodyParser.json 和 bodyParser.urlencoded 添加 100MB 的文件大小限制以及 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 }
这里的问题似乎是您的节点 1 前面有一个 Nginx 服务器 运行,它的默认大小限制很小。请参阅此问题以了解如何设置大小限制:Hardcode header size limit / timeout values in Nginx
问题最终不是 nginx,我试图通过 Mailgun 将图像作为附件通过电子邮件发送,并且硬性限制为 25MB。
在用户可以上传图片的部分编辑此行后一切正常:
let result = await cloudinary.v2.uploader.upload(file.path, {width: 1280, height: 720, crop: "limit"});