如何在JOI校验规则中正确复用独立枚举文件的枚举值
JOI枚举值复用解决方案
错误原因说明
你之前的写法存在两个问题:
- 枚举文件中
module.exports.empty = '', null是无效语法:JS赋值时逗号运算符会返回最后一个操作数,最终empty字段仅等于null,空字符串会被直接丢弃 - 数组参数未正确展开就传入
valid()/allow()方法,导致Joi将整个数组识别为单个校验值
步骤1:修正枚举文件导出逻辑
所有可复用枚举值统一用数组存储,方便多场景复用和后续维护:
// Enums.js module.exports.productCategory = ['JEWEL', 'WATCH', 'EARRING'] module.exports.allowEmptyValues = ['', null]
步骤2:校验规则中通过展开运算符传参
Joi的valid()、allow()方法支持可变参数,用ES6展开运算符...把数组拆为逐个传入的参数即可:
const path = require('path') const Joi = require('joi') const ENUMS = require(path.join(__dirname, 'enums')) const Product = Joi.object({ name: Joi.string(), // 展开枚举数组传参 category: Joi.string().valid(...ENUMS.productCategory), // 空值数组同理展开 description: Joi.string().allow(...ENUMS.allowEmptyValues) })
兼容写法(低版本Node.js环境)
如果你的运行环境不支持ES6展开运算符,可以用apply方法实现相同效果:
category: Joi.string().valid.apply(null, ENUMS.productCategory), description: Joi.string().allow.apply(null, ENUMS.allowEmptyValues)
内容的提问来源于stack exchange,提问作者NVO
相关产品推荐
相关产品推荐

