【问题标题】:Joi validate individual fields of nested schemaJoi 验证嵌套模式的各个字段
【发布时间】:2016-09-14 08:37:51
【问题描述】:

我有一个这样的嵌套架构设置:

var schema = Joi.object().keys({
  first_name: Joi.string().required(),
  last_name: Joi.string().required(),
  address: Joi.object().keys({
    street: Joi.string().required(),
    zip: Joi.number().required(),
    state: Joi.string().required(),
    country: Joi.string().required()
  }).required(),
})

var options = { abortEarly: false };

var result = Joi.validate({}, schema, options);

运行时,result.error 将返回消息:

[
  {message: '"first_name" is required', path: 'first_name' }, 
  {message: '"last_name" is required', path: 'last_name' },
  {message: '"address" is required', path: 'address' }
]

如您所见,address 字段未展开。我不想收到缺少整个地址字段的消息。相反,我想了解地址架构中缺少的各个项目。当我没有明确要求 address 时,其中的项目根本不会针对 required() 进行验证。嵌套字段验证似乎仅适用于整个嵌套模式对象级别,而不适用于模式级别中的单个项目。如何使其与单个嵌套架构项一起使用?

【问题讨论】:

  • 你能解决这个问题吗?

标签: joi


【解决方案1】:

添加“骨架”对象有效。 工作示例here

import Joi, {
  string,
  number,
  object
} from "joi";

var schema = object({
  first_name: string().required(),
  last_name: string().required(),
  address: object({
    street: string().required(),
    zip: number().required(),
    state: string().required(),
    country: string().required()
  })/*.required(), <= Not needed */
})
var skeleton = { address: {} };

var options = { abortEarly: false };

var validate = data => {
  var newData = Object.assign({}, skeleton, data);
  return Joi.validate( newData, schema, options);
}
console.log(
  JSON.stringify(validate({}).error.details, null, 2)
);

结果:

[
  {
    "message": "\"first_name\" is required",
    "path": "first_name",
    "type": "any.required",
    "context": {
      "key": "first_name"
    }
  },
  {
    "message": "\"last_name\" is required",
    "path": "last_name",
    "type": "any.required",
    "context": {
      "key": "last_name"
    }
  },
  {
    "message": "\"street\" is required",
    "path": "address.street",
    "type": "any.required",
    "context": {
      "key": "street"
    }
  },
  {
    "message": "\"zip\" is required",
    "path": "address.zip",
    "type": "any.required",
    "context": {
      "key": "zip"
    }
  },
  {
    "message": "\"state\" is required",
    "path": "address.state",
    "type": "any.required",
    "context": {
      "key": "state"
    }
  },
  {
    "message": "\"country\" is required",
    "path": "address.country",
    "type": "any.required",
    "context": {
      "key": "country"
    }
  }
]

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2019-03-23
    • 1970-01-01
    • 2019-04-30
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多