[23.12.29] TIL

yy·2023년 12월 30일

개발일지

목록 보기
68/122

💥👊트러블슈팅

프론트와 서버를 맞춰보고 로그인해서 프로필 이미지를 수정하던 중 문제가 발생했다. 내가 프로필 사진을 바꾸면 다른 사람의 프로필 사진까지 바꼈다. 이게 무슨...!
이미지를 조회했을때의 문제인줄 알았지만 DB를 조회해보니 내 프로필 사진과 몇 다른 사람의 프로필 사진이 동일하게 담겨있었다.

아니 이럴 수가 있나...? 우선 다른 팀원이 짠 코드에서 발견한 오류여서 조금은 조심스러웠다.

1. 우선 마이페이지 정보 수정 api를 살펴봤다.

다른 사용자도 수정이 되므로 로직이 이상이 있는건가 싶었다. 근데 일단 authmiddleware을 통해서 인가하고, 진행한 부분이라 로그인한 userId를 기준으로밖에 진행할 수 밖에 없는 로직이었다.
근데 왜 자꾸 다른 사람의 이미지가 바뀌는걸까?
디버깅을 해봤을때 userId로 하나의 사용자의 값만 들어왔었다. 그렇다는건 authmiddleware도 잘 된다는 것이었다.

router.patch(
  "/users/self/profile/edit",
  upload.single("imgUrl"),
  authMiddleware,
  async (req, res, next) => {
    try {
      const { userId } = req.user; // userId 값이 하나만 나옴 (정상)

그럼 저장하는 코드에서 이상이 있던걸까? 저장하는 부분에서는 딱히 이상이 있어 보이진 않았다.

const image = await jimp.read(req.file.buffer);
        const processedImage = await image
          .resize(jimp.AUTO, 150) 
          .quality(70) 
          .getBufferAsync(jimp.AUTO);

        const params = {
          Bucket: bucketName,
          Key: imageName,
          Body: processedImage,
          ContentType: req.file.mimetype,
        };

        const command = new PutObjectCommand(params);
        await s3.send(command);

        await prisma.users.update({
          where: {
            userId: +userId,
          },
          data: {
            imgUrl: imageName,
          },
        });
      }

2. 파일이름을 부여해주는 곳에서 이상이 있는건가?

싶어서 살펴보던 중 파일이름을 16진수 난수로 바꿔주는 부분이 안보였다. 헉 알고보니 router밖에 둬서 코드를 깔끔하게 하기 위함이었나보다. 그래서 다시 router안으로 옮기고 실행해보니 이상없이 돌아갔다.

const randomImageName = (bytes = 32) =>
  crypto.randomBytes(bytes).toString("hex");

const imageName = randomImageName();

router밖에 둔 이유가 전역적으로 사용하게 하기 위함으로 보인다. 근데 비동기처리가 되어있는경우에는 (외부 범위에서 선언되었고, 해당 변수를 사용하는 부분이 비동기적인 router 핸들러 내부에 있다면) router 핸들러가 실행될 때까지 imageName이 생성되지 않을 수 있다는 점에서 문제가 발생한 것으로 보인다.

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글