prisma 조건 검색

키브김·2023년 7월 24일
0

NextJS

목록 보기
6/6

profile 페이지를 만드는데 삽질을 너무 많이 했다..
prisma에서 테이블의 레코드를 검색하는 데는 여러 방법이 있다.
그 중에 findUniquefindFirst 가 있는데

findUnique - 조건문과 일치하는 레코드 반환.
findFirst - 조건문과 일치하는 레코드 중, 첫 번째 레코드 반환.

iron-session 을 이용한 유저 id 정보를 저장한 req.session.user?.idfindFirst의 where 조건문 값으로 넣어 줬는데 해당 값이 없음에도 불구하고 프리즈마의 조건 검색에서 유저가 존재한다고 나오는 문제가 발생했다.

일반적으로 save() 메서드로 세션을 저장하면 브라우저를 종료하거나 서버를 재시작 하는 경우 새로운 세션이 시작되어, 저장된 유저의 정보가 없어야 하는데 시크릿 모드로 접속해도 계속 유저의 정보를 불러왔다.

4시간의 삽질 끝에 한 가지 알아낸 것이 있다.
findUnique 메서드는 조건문 검색 시 일치하는 값이 없다면 null을 반환하지만
findFirst 메서드는 일치하는 값이 없다면 첫 번째 레코드를 반환해준다.
findFirst 메소드를 사용 했기 때문에 req.session.user?id 값이 undefined 임에도 불구하고 계속 유저 테이블의 첫 번째 레코드를 반환하여 유저가 존재 하는 것처럼 보였던 것이다..

시크릿 모드로 접속해도 유저의 정보가 남아있는 것처럼 보여서 미쳐버리는 줄 알았다.

수정 전 코드(문제 발생)

async function profile(req: NextApiRequest, res: NextApiResponse) {
  const user = await db.user.findFirst({
    where: {
      loginId: req.session.user?.id,
    },
  });
  return res.status(200).json({ success: true, user });
}

export default withSession(handleFetchApiUser("GET", profile));

수정 후 코드(문제 해결)

async function profile(req: NextApiRequest, res: NextApiResponse) {
  let user;
  if ((await req.session.user?.id) === undefined) {
    return res.status(404).end();
  } else {
    user = await db.user.findFirst({
      where: {
        loginId: req.session?.user?.id,
      },
    });
  }
                                   
  return res.json({ success: true, user });
}

export default withSession(handleFetchApiUser("GET", profile));
profile
배움과 익힘을 기록.

0개의 댓글