Впервые для NodeJS и S3, я написал следующий ознакомительный код для загрузки файлов на S3 через мой NodeJS сервер без сохранения файла на диск или в память:
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
я бы не знал, какие из них потерпели неудачу ...
Было бы хорошо иметь возможность сделать этот процесс загрузки несколько транзакционным (т. Е. Либо все загрузки успешны, или ни один не делает). Когда происходят ошибки, в идеале я смог бы "откатить" подмножество успешных загрузок.