1. 코드 설명
사용자 인증 미들웨어인 authMiddleware에서 userId 값을 받아오면, userId값에 해당하는 이력서의 목록을 출력하는 라우터이다. 사용자의 이름과 이력서 목록이 같이 출력되어야 한다. 따라서 User 테이블을 불러오면서, 사용자 이름이 있는 UserInfo 테이블과 이력서가 있는 MyResumes 테이블을 이중 select 처리하여 불러오도록 하였다.
router.get('/resume', authMiddleware, async (req, res, next) => {
const { userId } = req.user;
const myResumes = await prisma.Users.findFirst({
where: {
userId,
},
select: {
userId: true,
UserInfos: {
select: {
name: true,
},
},
},
orderBy: {
createdAt: 'desc',
},
});
return res.status(201).json({
status: 201,
message: '이력서 조회에 성공했습니다.',
data: { myResumes },
});
});
근데, relation 부분이 헷갈려서 실습때 했던거 보면서 따라한건데 에러가 발생했다...
2. 에러 메시지 & 원인
PrismaClientUnknownRequestError:
Invalid `prisma.users.findFirst()` invocation:
Unknown nested field 'userInfos' for operation findFirstUsers does not match any query.
심지어 터미널창에 에러메시지가 길게 떠서 뭔지 찾기도 어려웠는데, userInfos 부분이 문제였다고 한다.
prisma schema에서는 Users와 MyResumes를 1:N 관계로 relation 처리 해놨는데 에러가 난 상황..
model Users {
userId Int @id @default(autoincrement()) @map("user_id")
email String @unique @map("email")
password String @map("password")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
userInfo UserInfos?
myResumes MyResumes[]
@@map("users")
}
model UserInfos {
userInfoId Int @id @default(autoincrement()) @map("user_info_id")
userId Int @unique @map("user_id")
email String @unique @map("email")
name String @map("name")
password String @map("password")
position Position @default(APPLICANT) @map("position")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user Users @relation(fields: [userId], references: [userId], onDelete: Cascade)
@@map("user_infos")
}
내가 써놓고도 까먹은..
이력서 테이블 이름은 UserInfos, db상에서는 user_infos로 이름을 정했지만 Users와 relation을 처리할 때에는 앞글자가 소문자인 userInfo로 이름을 정해서 그런거였다.. 처음부터 통일을 하는게 나았으려나
3. 수정 결과
수정 결과는 이렇다.
select: {
userId: true,
userInfos: {
select: {
name: true,
},
},
},
심지어 prisma schema에는 s도 안붙이고 userInfo 라고만 해놓아서 이것도 수정하고 다시 실행해보았다.
이 때, prisma schema를 수정하고 나서는 yarn prisma db push 명령어로 꼭 db를 업데이트 해줘야 db에 반영된다.
{
"status": 201,
"message": "이력서 조회에 성공했습니다.",
"data": {
"myResumes": [
{
"userId": 2,
"userInfos": {
"name": "namehere"
}
}
]
}
}
해결 완료..!!
여기에 이력서 정보도 넣어보면 다음과 같이 나타난다.
const myResumes = await prisma.Users.findMany({
where: {
userId,
},
select: {
userId: true,
userInfos: {
select: {
name: true,
},
},
myResumes: {
select: {
resumeId: true,
title: true,
status: true,
createdAt: true,
updatedAt: true,
},
},
},
'TIL' 카테고리의 다른 글
TIL 240529 - 알고리즘 코드카타 리뷰 - 대충 만든 자판 (1) | 2024.05.29 |
---|---|
TIL 240528 - EC2와 RDS MySQL 연결 (1) | 2024.05.28 |
TIL 240527 - 미들웨어 함수에 인자를 추가로 받도록 설정 (1) | 2024.05.27 |
TIL 240523 | 알고리즘 코드카타 리뷰 - 옹알이(2) (0) | 2024.05.23 |
TIL 240417~240522 모음 (1) | 2024.05.23 |