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;
일반적인 실패의 경우 업로드중인 x 개 파일 중 하나 이상의 업로드가 실패하는 시나리오를 어떻게 처리합니까? 일부 업로드는 성공했을 것이고 일부는 실패했을 것입니다. 그러나 catch
절에서 나는 어떤 것이 실패했는지 알 수 없습니다 ...
이 업로드 프로세스를 다소 트랜잭션 적 으로 만들 수 있으면 좋을 것입니다 (즉, 모든 업로드가 성공하거나 성공하지 않음). 오류가 발생하면 이상적으로 는 성공적인 업로드의 하위 집합 을 "롤백" 할 수 있습니다 .
다음과 같이 할 수 있습니다.
재 시도해야하는 데이터와 함께 객체를 업로드에 푸시합니다.
uploads.push({
fieldname,
filename,
mimeType,
uploaded: S3.svc.upload({ Bucket: 'my-test-bucket', Key: filename, Body: stream })
.promise()
.then(() => true)
.catch(() => false)
});
...
const failed = await
(Promise.all(uploads.map(async upload => ({...upload, uploaded: await upload.uploaded})))).then(u => u.filter(upload => !upload.uploaded))
const failedFiles = failed.join(', ')
console.log(`The following files failed to upload: ${failedFiles}`);
이벤트 핸들러 async
를 await
내부 에서 사용할 수 있도록 만들어야합니다 . 예를 들면 다음과 같습니다.
bb.on('file', async (fieldname, stream, filename, encoding, mimeType) => {
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다