You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:17:47