如何配置Joi使其为缺失的键值对自动填充指定默认值?
Joi 自动填充字段默认值实现方案
Joi 原生就支持默认值填充能力,不需要额外引入插件,核心是用.default()方法指定默认值,同时调整字段的校验约束逻辑:
核心注意点
不要给需要自动填充默认值的字段加.required()约束:.required()的校验逻辑是「强制要求输入对象中必须存在对应字段」,只要输入缺字段就会直接抛出校验错误,根本不会走到默认值填充的流程。而.default()本身已经能保证校验通过的输出对象中一定存在该字段,完全可以替代required的存在性保证作用。
具体实现代码
首先修改原有Schema,给field_2加上默认值配置,移除它的.required()标记:
const schema = Joi.object({ field_1: Joi.string().required(), field_2: Joi.string().default("a default value") })
正常调用validate方法校验输入即可,返回结果中会自动补全缺失的默认字段:
const input = { field_1: "a string" } const { error, value } = schema.validate(input) console.log(value) // 输出结果完全符合预期: // { // field_1: "a string", // field_2: "a default value" // }
扩展用法
- 如果需要动态生成默认值,可以给
.default()传入一个无参函数,函数的返回值会作为填充的默认值,比如填充当前时间戳:Joi.number().default(() => Date.now()) - 如果需要嵌套对象里的字段补默认值,给对应嵌套字段单独加
.default()即可,逻辑和顶层字段完全一致 - 校验时如果需要过滤输入中不在Schema里定义的多余字段,可以在validate的配置项里加
stripUnknown: true,不会影响默认值的正常填充
内容的提问来源于stack exchange,提问作者charnould
相关产品推荐
相关产品推荐

