如何让Zod展示数组内嵌套对象的字段错误?
解决Zod嵌套数组对象错误未展开的问题
问题原因
你当前的Zod Schema验证数组中的空对象时,嵌套字段(price/off_price/sell_quantity)的错误被默认聚合到了sizes字段,导致flatten()无法展示具体的嵌套字段错误。
解决方案
1. 升级Zod到最新版本
确保你的Zod版本为3.x及以上,新版本的flatten()会自动保留嵌套字段的完整路径(如sizes.0.price),无需修改Schema即可得到细分的错误信息。
2. 为字段添加自定义错误消息(可选)
给每个嵌套字段添加明确的错误提示,让错误信息更直观:
z.object({ sizes: z.array( z.object({ price: z.string().nonempty("价格不能为空"), off_price: z.string().nonempty("优惠价不能为空"), sell_quantity: z.string().nonempty("销量不能为空"), }) ).nonempty("至少需要一个规格"), }).strict();
验证空对象Payload后,flatten()会返回:
{ "formErrors": [], "fieldErrors": { "sizes.0.price": ["价格不能为空"], "sizes.0.off_price": ["优惠价不能为空"], "sizes.0.sell_quantity": ["销量不能为空"] } }
3. 手动构建自定义错误结构(兼容旧版本)
如果无法升级Zod,可手动遍历错误信息,提取完整路径并构建细分的错误对象:
const validationResult = yourSchema.safeParse(yourPayload); if (!validationResult.success) { const { error } = validationResult; const customFieldErrors = error.issues.reduce((acc, issue) => { const fieldPath = issue.path.join('.'); acc[fieldPath] = [...(acc[fieldPath] || []), issue.message]; return acc; }, {}); // 这里使用customFieldErrors作为最终错误输出 }
内容的提问来源于stack exchange,提问作者Mehdi Faraji
相关产品推荐
相关产品推荐

