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

如何使用对象中的常量值验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:37:46