유용한 메서드
예시상황
이미 있는 이름과 이메일로 회원가입을 시도한다
→ create accout 버튼 클릭 시 모든 인풋에 대한 refinement가 이뤄진다.
→ 필드가 적을때는 괜찮지만 많아진다면??
→ 이를 줄이는 것이 중요하다
이때 !
사용자, 이메일에 각각 refine 하지 않고 object에 한번에 refine 한다. ⇒ superRefine
superRefine( (검사할데이터 , 에러묶음) ⇒ { 에러context에 접근하여 작업} )
app > create-account > actions.ts
// ...
const formSchema = z.object({
~~
})
.superRefine(async ({username}, ctx) => {
const user = await db.user.findUnique({
where: {
username
},
select: {
id: true
}
})
if(user) {
ctx.addIssue({
// issue에는 code가 필요하다
code: 'custom',
message: "This username is already exist" ,
// 이 에러메세지는 formErrors로 이동했음
// 왜냐하면 zod는 왜 원인인지 모름
// => 화면에 보여지는 작업 해줘야함 path로 알려줌
path: ["username"],
fatal: true // fatal과 NEVER이 있으면 다른 refine이 있어도, 멈추고 더 실행되지않음
})
return z.NEVER;
}
})
// 이메일도 동일하게
.superRefine(async ({email}, ctx) => {
const user = await db.user.findUnique({
where: {
email
},
select: {
id: true
}
})
if(user) {
ctx.addIssue({
code: 'custom',
message: "This email is already exist" ,
path: ["email"],
fatal: true
})
return z.NEVER;
}
})
// 이 밑으로 실행되는 refine은 위에서 에러가 난 경우 NEVER가 fatal Issue를 리턴하여 실행되지 않는다.
.refine(checkPasswords, {
message : "Both passwords should be the same!",
path: ["confirm_password"]
})