node.js - Minst ett/minimum ett felt i Zod-skjema validering
Jeg har implementert denne koden ved å bruke JOI, der brukeren må sende userId og minst en av nøklene fra kroppen. Hvordan implementere det samme ved å bruke ZOD ??
params: Joi.object().keys({
userId: Joi.required().custom(objectId),
}),
body: Joi.object()
.keys({
name: Joi.string(),
email: Joi.string().email(),
password: Joi.string().custom(password),
})
.min(1),
};
Svar #1
Jeg tror det ikke finnes noen direkte analog i zod, men du kan oppnå denne begrensningen ved å bruke refine eller superRefine
Å bruke 'refine your schema' kan se slik ut:
const schema = z.object({
params: z.object({
userId: z.string()
}),
body: z
.object({
name: z.string(),
email: z.string().email(),
password: z.string()
})
.partial()
.refine(
({ name, email, password }) =>
name !== undefined || email !== undefined || password !== undefined,
{ message: "One of the fields must be defined" }
)
});
Hvis raffineringen mislykkes, vil du få en ZodError med den angitte meldingen.
En mer generell refine-funksjon som kunne gjenbrukes på et vilkårlig delvis objekt, ville være noe som:
const atLeastOneDefined = (obj: Record<string | number | symbol, unknown>) =>
Object.values(obj).some(v => v !== undefined);
Jeg la merke til at det var tilpasset parsing for objekt-ID-en og passordet. Jeg tror begge kunne gjøres med refine også, men jeg er ikke kjent med hvordan tilpassede validatører i Joi fungerer, så jeg ønsket ikke å skrive dem med refine og få det til å bli feil kode.
