🐥

SupabaseのDateのカラムをZodでバリデーションするときの注意点

2024/07/30に公開

背景

SupabaseとNext.jsでアプリケーションを開発している際に、Zodのバリデーション日付をz.date()としていたが、SupabaseにInsertする際に、以下のようなErrorが発生していた。
type Date | undefined is not assignable to type string | null | undefined

原因としては、Supabaseの日付はString型を要求するが、z.date()はDate型を返却するため上記のようなエラーが発生するとのこと。

/api/event/route.ts
export const eventCreateSchema = z.object({
    name: z.string(),
    event_d: z.date()
});

export function POST() {
    const body = await request.json() || {};
    const payload = eventCreateSchema.parse(body);
    const supabase = createClient();
    const { data: agent, error } = await supabase
        .from("event")
        .insert(data) // event_dはString型を要求するが、Date型が入力されるのでエラー
    return NextResponse.json(data, { status: 200 });
}

解決

ZodはString型でDateのフォーマットにすることが出来る。
https://zod.dev/?id=dates

/api/event/route.ts
export const eventCreateSchema = z.object({
    name: z.string(),
    event_d: z.string().date()
});

export function POST() {
    const body = await request.json() || {};
    const payload = eventCreateSchema.parse(body);
    const supabase = createClient();
    const { data: agent, error } = await supabase
        .from("event")
        .insert(data) // event_dは文字列でDateフォーマットで入力されるためErrorにならない。
    return NextResponse.json(data, { status: 200 });
}


{
"status": "private",
"name": "Example",
"establishment_date": "2020-01-01"
}

SasaTech Engineer Blog

Discussion