如何修复 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 作为我的后端。

用户进程是这样​​的:

我正在使用 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"});