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

如何使用Yup剔除无效数据?验证对象时保留有效字段移除无效字段

如何用Yup验证对象时保留有效数据、剔除无效字段?

Yup 默认的验证逻辑是只要有字段不符合规则就会直接抛出错误,不会返回部分有效数据。要实现保留有效字段、剔除无效字段的需求,可以通过以下步骤操作:

步骤1:修改验证配置,收集所有错误

调用validate方法时设置abortEarly: false,让验证器检查所有字段而非遇到第一个错误就终止,同时能收集到所有验证失败的字段信息。

步骤2:捕获错误并过滤有效字段

捕获验证抛出的错误后,从原始数据中剔除验证失败的字段,剩余字段即为有效数据;若没有错误则直接返回完整数据。

完整实现代码

import { object, string, number, date, ValidationError } from 'yup';

const userSchema = object({
  name: string().required(),
  age: number().required().positive().integer(),
  email: string().email(),
  website: string().url().nullable(),
  createdOn: date().default(() => new Date()),
});

async function getValidatedData(data) {
  try {
    // 全量验证,不提前终止
    return await userSchema.validate(data, { abortEarly: false });
  } catch (err) {
    if (err instanceof ValidationError) {
      // 获取所有验证失败的字段名
      const invalidFields = new Set(err.inner.map(e => e.path));
      // 过滤出原始数据中不在无效字段列表里的字段
      const validData = Object.fromEntries(
        Object.entries(data).filter(([key]) => !invalidFields.has(key))
      );
      // 对过滤后的有效数据再次验证,确保无隐藏错误
      return await userSchema.validate(validData, { abortEarly: false });
    }
    throw err;
  }
}

// 使用示例
async function test() {
  const parsedUser = await getValidatedData({
    name: 'jimmy',
    age: -1,
  });
  console.log(parsedUser); // 输出:{ name: 'jimmy', createdOn: 当前日期 }
}

test();

补充说明

  • 二次验证是为了确保过滤后的字段完全符合规则,避免遗漏关联验证逻辑;
  • 若需要自动剔除Schema未定义的额外字段,可在验证时添加stripUnknown: true选项,但该选项仅处理Schema外的字段,不处理Schema内的无效字段。

内容的提问来源于stack exchange,提问作者A.A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:09:51