【发布时间】:2020-02-18 05:04:23
【问题描述】:
NodeJS 和 S3 的新手,我编写了以下探索性代码,通过我的 NodeJS 服务器将文件上传到 S3,而无需将文件保存到磁盘或内存:
var express = require('express');
var Busboy = require('busboy');
var S3 = require('../utils/s3Util');
var router = express.Router(); // mounted at /uploads
router.post("/", function (req, res, next) {
let bb = new Busboy({ headers: req.headers });
const uploads = [];
bb.on('file', (fieldname, stream, filename, encoding, mimeType) => {
console.log(`Uploaded fieldname: ${fieldname}; filename: ${filename}, mimeType: ${mimeType}`);
uploads.push(S3.svc.upload({ Bucket: 'my-test-bucket', Key: filename, Body: stream }).promise());
});
bb.on('finish', () => {
console.log("# of promises:", uploads.length);
Promise.all(uploads).then(retVals => {
for (let i = 0; retVals && i < retVals.length; i++) {
console.log(`File ${i + 1}::`, retVals[i]);
}
res.end();
}).catch(err => {
console.log("Error::", err);
res.status(500).send(`${err.name}: ${err.message}`);
});
});
req.pipe(bb);
});
module.exports = router;
一般失败情况下,上传1个或多个x个文件上传失败的情况如何处理?有些上传会成功,有些会失败。但是,在catch 子句中,我不知道哪些失败了...
最好能够使这个上传过程有点事务性(即,要么所有上传都成功,要么不成功)。发生错误时,理想情况下我能够“回滚”成功上传的子集。
【问题讨论】:
标签: javascript node.js amazon-s3 busboy