簡體   English   中英

Zod promise 拒絕:ZodError 始終返回空數組

[英]Zod promise rejection: ZodError always returns empty array

我想驗證來自后端的數據,我希望這些數據類似於這個 typescript 形狀

export interface Booking {
  locationId: string;
  bookingId: number;
  spotId: string;
  from: string;
  to: string;
  status: "pending" | "confirmed" | "closed";
}

所以我寫了 zod 模式和驗證器 function ,如下所示:

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);
}

現在我知道問題出在狀態字段上,因為它是最近添加的,我在日志中看到響應中缺少該字段,但從 Zod 我得到的是:

[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

有沒有辦法更詳細地描述導致問題的原因? 謝謝

我的猜測是 promise 拒絕是parse拋出的結果。 如果從 promise 的回調中或從async function 調用它,那么最終結果將是 promise 拒絕。

如果無法解析您指定的模式,則parse將拋出異常。 如果您的數據形狀與您的預期不同,那么它會拋出。 很難確切地說為什么它會在沒有看到JSON的情況下拋出,但我猜你對status的定義不正確。

|| 將被評估為邏輯或表達式,因此"pending" || "confirmed" || "closed" "pending" || "confirmed" || "closed" "pending" || "confirmed" || "closed"解析為"pending" (因為“待處理”是真值, ||將解析為鏈中的第一個值為真值)。 因此,狀態的其他值將導致解析失敗。

嘗試

status: z.enum(["pending", "confirmed", "closed"]),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM