Joi自定义验证不生效:如何将desc/asc转换为-1/1?
解决Joi custom()方法转换值不生效的问题
你的问题核心是schema定义结构错误,导致Joi没有执行custom里的转换逻辑,具体修改如下:
错误原因
你把Joi schema包裹在了普通对象中(const mySchema = { my_obj: Joi.object(...) }),Joi.compile无法正确识别这种结构,导致自定义转换逻辑完全没触发,自然返回原始的desc/asc值。
修改后的代码
// 正确用Joi.object定义整个schema结构 const mySchema = Joi.object({ my_obj: Joi.object({ id: Joi.number().positive().required(), sort: Joi.string() .lowercase() .valid('desc', 'asc') .default('desc') .custom((value) => { switch (value) { case 'desc': return -1; case 'asc': return 1; default: return value; // 兜底处理,避免返回undefined } }), }) }); const obj = { my_obj: { id: 1, sort: 'desc' } }; const { value, error } = Joi.compile(mySchema) .prefs({ errors: { label: 'key' }, abortEarly: false }) .validate(obj); console.log(value); // 输出:{ my_obj: { id: 1, sort: -1 } }
额外说明
- Joi的
custom()方法返回值就是最终要替换的结果,你的转换逻辑本身是对的,只是schema结构错误导致逻辑没执行。 - 添加
default分支是为了避免极端情况下返回undefined,增强代码健壮性。
内容的提问来源于stack exchange,提问作者Epple
相关产品推荐
相关产品推荐

