🐥
SupabaseのDateのカラムをZodでバリデーションするときの注意点
背景
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のフォーマットにすることが出来る。
/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 });
}
Discussion