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

