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

如何使用Joi校验数组对象的product字段值全部保持一致

Joi 校验实现代码

直接给出完整的校验schema定义:

const Joi = require('joi');

// 单条数据项结构校验规则
const dataItemSchema = Joi.object({
    transaction: Joi.string().required(),
    product: Joi.string().required(),
    lot: Joi.string().required(),
    liquidPrice: Joi.string().required(),
    liquidId: Joi.number().integer().required(),
    limitPrice: Joi.string().required(),
    stopPrice: Joi.string().required()
});

// 整体请求参数校验规则
const requestSchema = Joi.object({
    data: Joi.array()
        .items(dataItemSchema)
        .required()
        // 自定义product一致性校验
        .custom((dataArr, helpers) => {
            // 数组元素数量不大于1时无需校验一致性
            if (dataArr.length <= 1) return dataArr;
            // 取第一个元素的product作为校验基准
            const standardProduct = dataArr[0].product;
            // 校验所有元素product是否和基准一致
            const isAllSame = dataArr.every(item => item.product === standardProduct);
            if (!isAllSame) {
                return helpers.message('data数组元素数量大于1时,所有元素的product字段取值必须完全相同');
            }
            return dataArr;
        })
});

校验使用示例

// 合法参数示例:所有product相同
const validParams = {
    "data": [
        {
            "transaction": "LNS",
            "product": "XXX",
            "lot": "1",
            "liquidPrice": "0",
            "liquidId": 0,
            "limitPrice": "1780.00",
            "stopPrice": "0"
        },
        {
            "transaction": "LNS",
            "product": "XXX",
            "lot": "1",
            "liquidPrice": "0",
            "liquidId": 0,
            "limitPrice": "1780.00",
            "stopPrice": "0"
        }
    ]
};
const validResult = requestSchema.validate(validParams);
console.log(validResult.error); // 输出undefined,校验通过

// 非法参数示例:product不一致
const invalidParams = {
    "data": [
        {
            "transaction": "LNS",
            "product": "XXX",
            "lot": "1",
            "liquidPrice": "0",
            "liquidId": 0,
            "limitPrice": "1780.00",
            "stopPrice": "0"
        },
        {
            "transaction": "LNS",
            "product": "YYY",
            "lot": "1",
            "liquidPrice": "0",
            "liquidId": 0,
            "limitPrice": "1780.00",
            "stopPrice": "0"
        }
    ]
};
const invalidResult = requestSchema.validate(invalidParams);
console.log(invalidResult.error.message); // 输出自定义错误提示

实现逻辑说明

  • 先定义单条data元素的基础字段校验规则,确保每个字段的类型、必填性符合要求
  • 对整个data数组添加custom自定义校验钩子,只有数组长度大于1时才触发一致性校验
  • 以数组第一个元素的product值为基准,遍历所有元素判断是否全部一致,不一致时返回自定义错误信息

内容的提问来源于stack exchange,提问作者Rizal Iman Muttaqin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:09