使用Fastest-validator实现数组对象二选一字段校验需求
使用fastest-validator实现数组对象的二选一字段校验
针对你的需求,我们可以通过fastest-validator的自定义校验规则(custom)来实现数组内对象的二选一字段校验,同时保证index字段必填。
核心校验逻辑
- 数组中的每个对象必须包含必填的
index字段 - 每个对象必须且仅存在
url或thumbnail中的一个(二选一)
完整校验Schema示例
const Validator = require('fastest-validator'); const v = new Validator(); // 定义数组项的校验规则 const itemSchema = { index: { type: 'number', integer: true, positive: false, required: true }, // 自定义校验url和thumbnail的二选一逻辑 $$strict: true, // 严格模式,禁止对象包含未定义的字段(可选,按需调整) custom: { source: '({ url, thumbnail }) => { const hasUrl = typeof url !== "undefined"; const hasThumbnail = typeof thumbnail !== "undefined"; // 必须且只能存在一个字段 if ((hasUrl && hasThumbnail) || (!hasUrl && !hasThumbnail)) { return "必须且只能提供url或thumbnail中的一个字段"; } // 校验url格式(可选,按需调整) if (hasUrl && !/^https?:\/\/.+/i.test(url)) { return "url必须是有效的HTTP/HTTPS链接"; } // 校验thumbnail格式(可选,按需调整) if (hasThumbnail && !/^https?:\/\/.+/i.test(thumbnail)) { return "thumbnail必须是有效的HTTP/HTTPS链接"; } return true; }' } }; // 定义数组的校验规则 const schema = { items: { type: 'array', items: itemSchema, min: 1 // 数组至少包含一个元素(可选,按需调整) } }; // 编译校验器 const validate = v.compile(schema);
测试示例
// 合法输入 const validInput = { items: [ { url: "https://test.com/url", index: 0 }, { thumbnail: "https://test.com/thumbnail", index: 1 } ] }; const validResult = validate(validInput); console.log(validResult); // 输出true,表示校验通过 // 非法输入:同时包含url和thumbnail const invalidInput1 = { items: [ { url: "https://test.com/url", thumbnail: "https://test.com/thumbnail", index: 0 } ] }; const invalidResult1 = validate(invalidInput1); console.log(invalidResult1); // 输出错误信息 // 非法输入:两个字段都不包含 const invalidInput2 = { items: [ { index: 0 } ] }; const invalidResult2 = validate(invalidInput2); console.log(invalidResult2); // 输出错误信息
关键说明
$$strict: true:开启严格模式后,对象不能包含Schema中未定义的字段,若不需要此限制可以移除- 自定义校验器中的URL格式校验可根据实际需求删除或修改
index字段的校验规则(如是否允许负数、是否为整数)可按需调整
内容的提问来源于stack exchange,提问作者Amir5204
相关产品推荐
相关产品推荐

