Joi自定义验证器未执行:如何将空字符串字段转为null?
问题
当字段name的值为空字符串('')时,希望Joi Schema返回null,但自定义验证器逻辑未运行。发现当键值为空字符串时,自定义验证器不会执行,该如何解决?
代码示例:
const Joi = require('joi'); const schema = Joi.object() .keys({ name: Joi.string().optional().trim().allow(null, '').custom((value, helpers) => { console.log('-------------------', value) if (value === '') { return null; } return value; }), }); // 运行步骤 const input = { name: '', // 空字符串 }; const result = schema.validate(input); console.log(input, result.value); // 预期输出: {name: null} // 实际输出: {name: ''}
原因
Joi的allow(null, '')会将空字符串和null标记为合法值,直接跳过后续所有验证/转换逻辑(包括custom验证器),因此你的自定义转换代码不会被执行。
解决方案
方法1:调整规则顺序
将allow移到custom之后,这样自定义逻辑会先执行,再标记值为合法:
const Joi = require('joi'); const schema = Joi.object() .keys({ name: Joi.string().optional().trim() .custom((value, helpers) => { if (value === '') { return null; } return value; }) .allow(null, ''), // 移到custom之后 }); const input = { name: '' }; const result = schema.validate(input); console.log(result.value); // 输出: { name: null }
方法2:使用transform(推荐)
transform是Joi专门用于值转换的API,比custom更适合这类场景,且不受allow的执行顺序影响:
const Joi = require('joi'); const schema = Joi.object() .keys({ name: Joi.string().optional().trim().allow(null, '') .transform((value) => { return value === '' ? null : value; }), }); const input = { name: '' }; const result = schema.validate(input); console.log(result.value); // 输出: { name: null }
内容的提问来源于stack exchange,提问作者Madhava Reddy
相关产品推荐
相关产品推荐

