首页 > 解决方案 > Joi 中 any.when() 的异常行为

问题描述

const Joi = require('@hapi/joi')

var schema_1 = Joi.object({
    a: Joi.number().integer(),
    b: Joi.number().integer()
}).when(Joi.object({
    'a': Joi.number().valid(5),
    'b': Joi.number().valid(10),
}), {then: Joi.any().forbidden()})

var schema_2 = Joi.object({
    a: Joi.number().integer(),
    b: Joi.number().integer()
}).when(Joi.object({
    'a': Joi.number().valid(5),
}), {then: Joi.any().forbidden()})

var object = {
    a: 5,
    b: 10
}

schema_1.validate(object) // this throws ValidationError
schema_2.validate(object) // this does not throw any error

我也出现错误schema_2为什么
没有schema_2显示任何错误?

标签: javascriptjsonvalidationobjectjoi

解决方案


不要忘记bschema_2.

const Joi = require('@hapi/joi')

var schema_1 = Joi.object({
    a: Joi.number().integer(),
    b: Joi.number().integer()
}).when(Joi.object({
    'a': Joi.number().valid(5),
    'b': Joi.number().valid(10),
}), {then: Joi.any().forbidden()})

var schema_2 = Joi.object({
    a: Joi.number().integer(),
    b: Joi.number().integer()
}).when(Joi.object({
    'a': Joi.number().valid(5),
    'b': Joi.any(),
}), {then: Joi.any().forbidden()})

var object = {
    a: 5,
    b: 10
}

schema_1.validate(object) // this throws ValidationError
schema_2.validate(object) // this does not throw any error

这是结果。

const x = schema_1.validate(object) // this throws ValidationError
const y = schema_2.validate(object) // this does not throw any error

console.log(x)
console.log(y)
{ value: { a: 5, b: 10 },
  error:
   { ValidationError: "value" is not allowed _original: { a: 5, b: 10 }, details: [ [Object] ] } }
{ value: { a: 5, b: 10 },
  error:
   { ValidationError: "value" is not allowed _original: { a: 5, b: 10 }, details: [ [Object] ] } }

推荐阅读