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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:15:26