유용한 메서드

예시상황

이미 있는 이름과 이메일로 회원가입을 시도한다

→ 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"]
})