Joi 验证嵌套模式的各个字段

标签 joi

我有一个这样的嵌套模式设置:

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() 进行验证根本。嵌套字段验证似乎只适用于整个嵌套架构对象级别,而不适用于架构级别内的单个项目。如何使其与单个嵌套架构项一起使用?

最佳答案

添加“骨架”对象有效。
工作示例 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"
    }
  }
]

关于Joi 验证嵌套模式的各个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289777/

相关文章:

node.js - HapiJS/Joi 允许字段为具有特定键的字符串或对象

javascript - 如何使用 JOI 验证请求正文中的对象数组

node.js - hapi 17 与 joi 验证断言错误

node.js - TypeScript Joi : Property 'validate' does not exist on type 'Root'

javascript - 如何确保一个对象数组只包含一个带有 Joi 的特定键?

node.js - Joi如何验证两个字段之一不应为空

node.js - joi 验证中的 .when(),根据另一个 key 验证一个 key

node.js - Express-validator:我们如何验证对象键?

javascript - Joi 验证模式 - 两个字段不能具有相同的值

node.js - 如何在 Joi 字符串验证中使用枚举值