如何为Joi验证Schema添加验证前的数据预处理函数?
Joi验证前预处理输入值的实现方法
当然可以。Joi提供了专门的API来实现验证规则执行前的输入值预处理,常用的有两种方式:any.transform()(Joi v17+推荐)和any.custom()。
方法一:使用any.transform()(推荐)
transform()方法专门用于在验证前转换输入值,它会返回转换后的结果供后续规则验证,示例如下:
const Joi = require('joi'); // 自定义日期转换函数 const convertToSomeFormat = (originalValue) => { // 示例:将任意可解析的日期格式转为ISO格式,可根据需求调整转换逻辑 const date = new Date(originalValue); return isNaN(date.getTime()) ? originalValue : date.toISOString(); }; const schema = Joi.object({ date: Joi.transform((originalValue) => convertToSomeFormat(originalValue)) .date() // 对转换后的日期进行格式验证 .required() }); // 测试示例 const testInput1 = { date: '2023-10-05' }; const testInput2 = { date: '10/05/2023' }; console.log(schema.validate(testInput1)); // 验证通过,date转为ISO格式 console.log(schema.validate(testInput2)); // 转换后验证通过
方法二:使用any.custom()
custom()方法允许你自定义处理逻辑,既可以做预处理,也可以自定义验证规则。需要在函数中返回处理后的值,后续规则会基于这个值进行验证:
const Joi = require('joi'); const convertToSomeFormat = (originalValue) => { const date = new Date(originalValue); return isNaN(date.getTime()) ? originalValue : date.toISOString(); }; const schema = Joi.object({ date: Joi.custom((value) => { // 先预处理值 const processedValue = convertToSomeFormat(value); // 返回处理后的值,供后续的date()规则验证 return processedValue; }).date().required() }); // 测试效果和方法一一致
注意事项
- 预处理函数需要处理转换失败的情况(比如无效日期),避免后续验证出现异常。
transform()是Joi v17版本新增的方法,更专注于值转换场景,代码可读性更高;如果使用旧版本Joi,只能用custom()实现。
内容的提问来源于stack exchange,提问作者0xbarrister
相关产品推荐
相关产品推荐

