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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:48:22