프론트와 서버를 맞춰보고 로그인해서 프로필 이미지를 수정하던 중 문제가 발생했다. 내가 프로필 사진을 바꾸면 다른 사람의 프로필 사진까지 바꼈다. 이게 무슨...!
이미지를 조회했을때의 문제인줄 알았지만 DB를 조회해보니 내 프로필 사진과 몇 다른 사람의 프로필 사진이 동일하게 담겨있었다.
아니 이럴 수가 있나...? 우선 다른 팀원이 짠 코드에서 발견한 오류여서 조금은 조심스러웠다.
다른 사용자도 수정이 되므로 로직이 이상이 있는건가 싶었다. 근데 일단 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,
},
});
}
싶어서 살펴보던 중 파일이름을 16진수 난수로 바꿔주는 부분이 안보였다. 헉 알고보니 router밖에 둬서 코드를 깔끔하게 하기 위함이었나보다. 그래서 다시 router안으로 옮기고 실행해보니 이상없이 돌아갔다.
const randomImageName = (bytes = 32) =>
crypto.randomBytes(bytes).toString("hex");
const imageName = randomImageName();
router밖에 둔 이유가 전역적으로 사용하게 하기 위함으로 보인다. 근데 비동기처리가 되어있는경우에는 (외부 범위에서 선언되었고, 해당 변수를 사용하는 부분이 비동기적인 router 핸들러 내부에 있다면) router 핸들러가 실행될 때까지 imageName이 생성되지 않을 수 있다는 점에서 문제가 발생한 것으로 보인다.