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

如何实现NPM Joi仅对存在字段验证,不存在则忽略?

Joi验证:仅对存在的字段应用验证

问题场景

我尝试了以下代码,运行正常:

const Joi = require('joi');
let schema = Joi.object().keys({
    id:Joi.number().required(),
    first_name: Joi.string().min(2).max(10),
    last_name: Joi.string().min(2).max(10)
});
const req = {
    id: 1,
    first_name: 'AAA',
    last_name: 'BBB'
};

Joi.validate(req, schema, (err) => {
    console.log(err);
});

但当请求数据为:

const req = {
    id: 1,
    last_name: 'BBB'
};

时,Joi提示first_name不能为空。需要配置Joi使其仅对请求数据中存在的字段应用验证,不存在的字段则忽略验证。

解决方案

给非必填字段添加optional()方法,即可让Joi忽略不存在的字段,只验证存在的字段。

修改后的schema代码:

const Joi = require('joi');
let schema = Joi.object().keys({
    id: Joi.number().required(),
    first_name: Joi.string().min(2).max(10).optional(),
    last_name: Joi.string().min(2).max(10).optional()
});

补充说明

  • 若使用Joi v16及以上版本,字段默认是可选的,只要不添加required()就不会强制要求字段存在,但显式声明optional()能让代码意图更清晰。
  • 如果需要返回所有验证错误而非仅第一个,可在验证时传入abortEarly: false选项:
Joi.validate(req, schema, { abortEarly: false }, (err) => {
    console.log(err);
});

内容的提问来源于stack exchange,提问作者Naga Harish M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:54:22