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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:36:03