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.

Relaterte artikler