내 서버를 통해 S3에 여러 파일을 업로드 할 때 실패를 어떻게 복구합니까?

Markvgti

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}`);

이벤트 핸들러 asyncawait내부 에서 사용할 수 있도록 만들어야합니다 . 예를 들면 다음과 같습니다.

bb.on('file', async (fieldname, stream, filename, encoding, mimeType) => {

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

명령 줄 도구를 통해 큰 .iso 파일을 여러 DVD로 분할하려면 어떻게합니까?

분류에서Dev

Sparklyr를 통해 로컬 모드에서 Spark를 실행할 때 드라이버 메모리를 구성하려면 어떻게해야합니까?

분류에서Dev

php를 통해 mysql에 pdf 파일을 업로드 할 때 쿼리가 실패했습니다.

분류에서Dev

RDS에서 S3로 데이터를 내보내려고 할 때 엔드 포인트에 연결하려면 어떻게해야합니까?

분류에서Dev

boto3를 사용하여 Github의 파일을 AWS S3 버킷에 업로드하려면 어떻게해야합니까?

분류에서Dev

내 서버에서 DST를 자동으로 사용할 때 cron을 사용하여 DST를 인식하지 않는 응용 프로그램에서 일광 절약을 구현하는 스크립트를 예약하려면 어떻게해야합니까?

분류에서Dev

Google App Script를 통해 Google Sheet에서 여러 행을 편집 할 때 실제 범위를 얻으려면 어떻게해야합니까?

분류에서Dev

Android에서 여러 preferences.xml 파일을 생성 할 때 코드를 재사용하려면 어떻게해야합니까?

분류에서Dev

업로드 할 때 codeigniter에서 내 이미지의 작업 경로를 어떻게 얻을 수 있습니까?

분류에서Dev

파일을 삭제할 때 VS Code에서 경고를 보내려면 어떻게해야합니까?

분류에서Dev

Java를 사용하여 웹 서버를 통해 R 파일을 보내려면 어떻게해야합니까?

분류에서Dev

PM2를 사용하여 클러스터 모드에서 node.js 앱을 실행할 때 명령 줄을 통해 환경 변수를로드하려면 어떻게해야합니까?

분류에서Dev

내부 서버 오류-AWS Lambda / API Gateway / s3를 통해 base64를 업로드 할 때

분류에서Dev

Gentoo에서 Emerge는 "단일 패키지 슬롯 내에서 여러 패키지 인스턴스를 가져 왔습니다."로 실패합니다. 어떻게 해결할 수 있습니까?

분류에서Dev

Stripe에서 반복 결제가 실패 할 때 고객에게 이메일을 보내려면 어떻게해야합니까?

분류에서Dev

어떻게 안드로이드 프로토콜을 통해 HTTP 서버에 동시에 여러 파일과 텍스트를 보낼 수 있습니까?

분류에서Dev

Angular에서 REST API를 통해 CSV 파일을 업로드하려면 어떻게해야합니까?

분류에서Dev

Android 4.3의 Phonegap에서 FileTransfer를 사용하여 S3에 파일을 업로드 할 때 코드 3

분류에서Dev

Flask를 사용하여 파일을 디렉터리에 업로드 할 때 내부 서버 오류 코드 500

분류에서Dev

ssh를 통해 원격 서버에 로그온 할 때 디렉토리를 변경하고 bash 옵션을 설정하려면 어떻게해야합니까?

분류에서Dev

s3 버킷 (런던)에 파일을 업로드 할 수 없기 때문에 s4cmd가 서명 버전 4를 지원합니까?

분류에서Dev

PHP에서 내 코드에 대해 여러 쿼리를 어떻게 실행할 수 있습니까?

분류에서Dev

Ruby를 사용하여 씬 서버를 시작하려면 어떻게해야합니까? require ': 이러한 파일을로드 할 수 없습니다-app (LoadError)

분류에서Dev

xampp 서버를 통해 내 보낸 filezilla에서 업로드 된 .sql 데이터베이스를 어떻게 사용할 수 있습니까?

분류에서Dev

Makefile 프로젝트- "-j"인수를 통해 여러 작업을 사용할 때 빌드 실패 방지

분류에서Dev

내 웹 서버를 통해 액세스 할 수 없도록 파일을 어디로 이동해야합니까?

분류에서Dev

Batch를 통해 Github에서 파일을 어떻게 다운로드합니까?

분류에서Dev

CreateUploadSesssion을 사용하여 파일을 업로드 할 때 서버에서 코드 : InternalServerError를 반환합니다.

분류에서Dev

AWS SDK를 설치하지 않고 AES256 암호화를 사용하여 Powershell을 통해 S3에 파일을 업로드하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    명령 줄 도구를 통해 큰 .iso 파일을 여러 DVD로 분할하려면 어떻게합니까?

  2. 2

    Sparklyr를 통해 로컬 모드에서 Spark를 실행할 때 드라이버 메모리를 구성하려면 어떻게해야합니까?

  3. 3

    php를 통해 mysql에 pdf 파일을 업로드 할 때 쿼리가 실패했습니다.

  4. 4

    RDS에서 S3로 데이터를 내보내려고 할 때 엔드 포인트에 연결하려면 어떻게해야합니까?

  5. 5

    boto3를 사용하여 Github의 파일을 AWS S3 버킷에 업로드하려면 어떻게해야합니까?

  6. 6

    내 서버에서 DST를 자동으로 사용할 때 cron을 사용하여 DST를 인식하지 않는 응용 프로그램에서 일광 절약을 구현하는 스크립트를 예약하려면 어떻게해야합니까?

  7. 7

    Google App Script를 통해 Google Sheet에서 여러 행을 편집 할 때 실제 범위를 얻으려면 어떻게해야합니까?

  8. 8

    Android에서 여러 preferences.xml 파일을 생성 할 때 코드를 재사용하려면 어떻게해야합니까?

  9. 9

    업로드 할 때 codeigniter에서 내 이미지의 작업 경로를 어떻게 얻을 수 있습니까?

  10. 10

    파일을 삭제할 때 VS Code에서 경고를 보내려면 어떻게해야합니까?

  11. 11

    Java를 사용하여 웹 서버를 통해 R 파일을 보내려면 어떻게해야합니까?

  12. 12

    PM2를 사용하여 클러스터 모드에서 node.js 앱을 실행할 때 명령 줄을 통해 환경 변수를로드하려면 어떻게해야합니까?

  13. 13

    내부 서버 오류-AWS Lambda / API Gateway / s3를 통해 base64를 업로드 할 때

  14. 14

    Gentoo에서 Emerge는 "단일 패키지 슬롯 내에서 여러 패키지 인스턴스를 가져 왔습니다."로 실패합니다. 어떻게 해결할 수 있습니까?

  15. 15

    Stripe에서 반복 결제가 실패 할 때 고객에게 이메일을 보내려면 어떻게해야합니까?

  16. 16

    어떻게 안드로이드 프로토콜을 통해 HTTP 서버에 동시에 여러 파일과 텍스트를 보낼 수 있습니까?

  17. 17

    Angular에서 REST API를 통해 CSV 파일을 업로드하려면 어떻게해야합니까?

  18. 18

    Android 4.3의 Phonegap에서 FileTransfer를 사용하여 S3에 파일을 업로드 할 때 코드 3

  19. 19

    Flask를 사용하여 파일을 디렉터리에 업로드 할 때 내부 서버 오류 코드 500

  20. 20

    ssh를 통해 원격 서버에 로그온 할 때 디렉토리를 변경하고 bash 옵션을 설정하려면 어떻게해야합니까?

  21. 21

    s3 버킷 (런던)에 파일을 업로드 할 수 없기 때문에 s4cmd가 서명 버전 4를 지원합니까?

  22. 22

    PHP에서 내 코드에 대해 여러 쿼리를 어떻게 실행할 수 있습니까?

  23. 23

    Ruby를 사용하여 씬 서버를 시작하려면 어떻게해야합니까? require ': 이러한 파일을로드 할 수 없습니다-app (LoadError)

  24. 24

    xampp 서버를 통해 내 보낸 filezilla에서 업로드 된 .sql 데이터베이스를 어떻게 사용할 수 있습니까?

  25. 25

    Makefile 프로젝트- "-j"인수를 통해 여러 작업을 사용할 때 빌드 실패 방지

  26. 26

    내 웹 서버를 통해 액세스 할 수 없도록 파일을 어디로 이동해야합니까?

  27. 27

    Batch를 통해 Github에서 파일을 어떻게 다운로드합니까?

  28. 28

    CreateUploadSesssion을 사용하여 파일을 업로드 할 때 서버에서 코드 : InternalServerError를 반환합니다.

  29. 29

    AWS SDK를 설치하지 않고 AES256 암호화를 사용하여 Powershell을 통해 S3에 파일을 업로드하려면 어떻게해야합니까?

뜨겁다태그

보관