javascript - Zod promise-avslag: ZodError returnerar alltid tom array
Jag vill validera data som kommer från backend, jag vill att dessa data ska likna denna TypeScript-form
export interface Booking {
locationId: string;
bookingId: number;
spotId: string;
from: string;
to: string;
status: "pending" | "confirmed" | "closed";
}
så jag har skrivit ett zod-schema och en validatorfunktion på följande sätt:
const bookingOnLoadResponse = z.array(
z.object({
locationId: z.string(),
bookingId: z.number(),
spotId: z.string(),
status: z.literal("pending" || "confirmed" || "closed"),
from: z.string(),
to: z.string(),
})
);
export function bookingOnLoadValidator(bookingArray: unknown) {
return bookingOnLoadResponse.parse(bookingArray);
}
nu vet jag att problemet ligger i statusfältet, eftersom det lades till nyligen och jag ser i loggarna att detta fält saknas i svaret, men från Zod får jag bara:
[Unhandled promise rejection: ZodError: []
at http://10.3.42.237:19000/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&strict=false&minify=false:226607:293 in _createSuperInternal
at node_modules/zod/lib/ZodError.js:29:8 in constructor
at node_modules/zod/lib/types.js:29:22 in handleResult
at node_modules/zod/lib/types.js:120:23 in ZodType#parse
at utils/zodSchemas/bookingResponseSchema.ts:16:9 in bookingOnLoadValidator
at utils/fetchFunctions.ts:28:9 in fetchBookings
Finns det ett sätt att få en mer detaljerad beskrivning av vad som orsakar problemet? Tack
Svar #1
Min gissning är att löftesavslaget är ett resultat av att parse kastar ett undantag. Om det kallas från en callbacks funktion i ett löfte eller från en async-funktion, skulle det slutgiltiga resultatet vara ett löftesavslag.
parse kommer att kasta ett undantag om det misslyckas med att tolka det schema du har angivit. Om något om formen på dina data är annorlunda än du förväntar dig, så kommer det att kasta. Det är svårt att säga exakt varför det kastar utan att se JSON, men min gissning är att din definition för status inte är korrekt.
|| kommer att utvärderas som ett logiskt eller-uttryck, så "pending" || "confirmed" || "closed" löses till "pending" (eftersom "pending" är sant och || kommer att lösa till det första värdet i kedjan som är sant). På grund av det kommer de andra värdena för status resultera i misslyckande vid tolkning.
Försök
status: z.enum(["pending", "confirmed", "closed"]),
