4주 프로젝트 Error Handling #1

4주 프로젝트를 진행하면서 수많은 에러들을 만날텐데, 4주 프로젝트가 진행된지 2주가 지나서야 에러 핸들링을 어떻게했는지 남기면 좋을거같다는 생각이 들어 이제부터라도 남겨보려고한다.

const storage = multerS3({
  s3: s3,
  bucket: process.env.S3_BUCKET_NAME,
  contentType: multerS3.AUTO_CONTENT_TYPE,
  acl: 'public-read',
  metadata: function (req, file, cb) {
    cb(null, { fieldName: file.fieldname });
  },
  key: function (req, file, cb) {
    if (file.originalname.match(/\.(mp4|MPEG-4|mkv)$/)) {
      cb(null, `reviewVideo/${Date.now()}_${file.originalname}`);
    } else if (req.files.keyboardImg) {
      cb(null, `keyboards/${Date.now()}_${file.originalname}`);
    } else if (req.files) {
      cb(null, `review/${Date.now()}_${file.originalname}`);
    } else {
      cb(null, `profile/${Date.now()}_${file.originalname}`);
    }
  },
});

multer S3 를 이용하여 사진이 업로드 될 때, S3에 어떤 이미지가 어떤 폴더로 저장될지 작성해놓은 코드다. key부분을 살펴보면 file의 확장자가 mp4, mepg-4 등 음악이나 동영상일이면 S3의 reviewVideo 로 저장이되며 밑에도 비슷한 메커니즘의 코드들이다.

처음 테스트를 진행할때 user profile 을 수정해보려고 사진을 넣었는데 req.files.keyboardImg 가 undefined 라고 오류가 떳다. 내 짧은 지식으로는 req.files.keyboardImg 가 없으면 다음 조건문으로 넘어갈줄알았지만 그렇지않았다. 그래서 구글링을 하다가 찾아낸게 Optional Chaining 이라는 것이다.

먼저 optional chaining 이란,

optional chaining 연산자 ?. 는 체인의 각 참조가 유효한지 명시적으로 검증하지 않고, 
연결된 객체 체인 내에 깊숙이 위치한 속성 값을 읽을 수 있다. ?. 연산자는 . 체이닝 연산자와 
유사하게 작동하지만, 만약 참조가 nullish (en-US) (null 또는 undefined)이라면, 
에러가 발생하는 것 대신에 표현식의 리턴 값은 undefined로 단락된다. 함수 호출에서 사용될 때, 
만약 주어진 함수가 존재하지 않는다면, undefined를 리턴한다.

출처 : MDN

쉽게 설명하자면 만약 참조가 null or undefined라면 에러가 발생하지않고 그냥 undefined 가 리턴된다는것이다.

optional chaining 을 토대로 수정한 후 테스트를 해보니 문제없이 작동되었다.

const storage = multerS3({
  s3: s3,
  bucket: process.env.S3_BUCKET_NAME,
  contentType: multerS3.AUTO_CONTENT_TYPE,
  acl: 'public-read',
  metadata: function (req, file, cb) {
    cb(null, { fieldName: file.fieldname });
  },
  key: function (req, file, cb) {
    if (file.originalname.match(/\.(mp4|MPEG-4|mkv)$/)) {
      cb(null, `reviewVideo/${Date.now()}_${file.originalname}`);
    } else if (req.files?.keyboardImg) {
      cb(null, `keyboards/${Date.now()}_${file.originalname}`);
    } else if (req.files) {
      cb(null, `review/${Date.now()}_${file.originalname}`);
    } else {
      cb(null, `profile/${Date.now()}_${file.originalname}`);
    }
  },
});

좋은 웹페이지 즐겨찾기