如何使用对象中的常量值验证Joi字符串字段?
Joi验证中使用常量对象有效值的正确实现方式
问题背景
原有Joi验证逻辑直接在valid()方法中硬编码字符串有效值:
const toValidate = Joi.object({ emailTiming: Joi.string().valid('DAILY','WEEKLY','MONTHLY','QUARTERLY','MEDIAN','YEARLY').required() });
为提升代码可维护性,已定义常量对象存储有效值:
const EMAIL_DISPATCH_TIMING = { DAILY: 'DAILY', WEEKLY: 'WEEKLY', MONTHLY: 'MONTHLY', QUARTERLY: 'QUARTERLY', MEDIAN: 'MEDIAN', YEARLY: 'YEARLY' };
尝试直接传入Object.values(EMAIL_DISPATCH_TIMING)到valid()方法时验证无效,需调整实现方式。
正确解法
Joi的valid()方法需要接收多个独立参数而非数组,因此需使用**展开运算符(...)**将Object.values()返回的数组拆分为单个参数传入:
const toValidate = Joi.object({ emailTiming: Joi.string().valid(...Object.values(EMAIL_DISPATCH_TIMING)).required() });
原理说明
Object.values(EMAIL_DISPATCH_TIMING)会返回包含所有有效值的数组:['DAILY', 'WEEKLY', 'MONTHLY', 'QUARTERLY', 'MEDIAN', 'YEARLY']- 若直接将数组传入
valid(),Joi会把整个数组当作一个单独的有效值(即验证时要求输入必须等于该数组),不符合业务需求 - 展开运算符
...会将数组中的每个元素作为独立参数传递给valid(),效果与直接写多个字符串参数完全一致
内容的提问来源于stack exchange,提问作者roeygol
相关产品推荐
相关产品推荐

