如何使用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
相关产品推荐
相关产品推荐

