【问题标题】:Joi validation set default as empty objectJoi 验证集默认为空对象
【发布时间】:2017-08-23 17:26:25
【问题描述】:

我在使用 Joi 验证时遇到了一个问题(或我认为的问题)。如果它作为请求正文的一部分传递,我正在尝试为不存在的键分配一个值。

例如:

parameters: Joi.object().keys({
  keyA: Joi.string().allow('').allow(null).default(null),
  keyB: Joi.object().keys({
    b1: Joi.string(),
    b2: Joi.string(),
    b3: Joi.object().keys({
      b3_1: Joi.string(),
      b3_2: Joi.string(),
      b3_3: Joi.string()
    })
  }).default({}),
  keyC: Joi.object().keys({
    c1: Joi.number(),
    c2: Joi.number(),
    c3: Joi.boolean(),
    c4: Joi.boolean()
  }).default({}),
  keyD: Joi.object().keys({
    d1: Joi.number(),
    d2: Joi.number()
  }).default({}),
  keyE: Joi.object().keys({
    e1: Joi.number()
  }).default({}) 
}).allow(null)

所以具体来说,如果我要通过的话:

{
  keyA: "foo",
  keyD: {
    d1: 21.9,
    d2: 21.1
  },
  keyE: {
    e1: 42
  }
}

我会得到这个作为回报

{
  keyA: "foo",
  keyB: {},
  keyC: {},
  keyD: {
    d1: 21.9,
    d2: 21.1
  },
  keyE: {
    e1: 42
  }
}

使用 :eyes: 在空对象上。 Joi.default() 方法缺少什么?我是否过度扩展了 Joi 的意义?

【问题讨论】:

  • 请注意,我没有看到验证错误 - 我只是没有得到想要的结果

标签: hapijs joi


【解决方案1】:

你可以设置默认值,你应该试试这个:

parameters: Joi.object().keys({
  keyA: Joi.string().allow(null).default(null),
  keyB: Joi.object().keys({
    b1: Joi.string().default("abc"),
      b2: Joi.string().default("abc"),
      b3: Joi.object().keys({
        b3_1: Joi.string().default("abc"),
        b3_2: Joi.string().default("abc"),
        b3_3: Joi.string().default("abc")
      })
    })
  }).default({}),
  keyC: Joi.object().keys({
    c1: Joi.number().default(0),
    c2: Joi.number().default(0),
    c3: Joi.boolean().default(0),
    c4: Joi.boolean().default(0)
  }).default({}),
  keyD: Joi.object().keys({
    d1: Joi.number().default(0),
    d2: Joi.number().default(0)
  }).default({}),
  keyE: Joi.object().keys({
    e1: Joi.number().default(0)
  }).default({}) 
}).allow(null)

【讨论】:

  • 感谢您回来!目标是将对象的默认值设置为空对象。我不关心对象键的值——它们只是为了展示我的例子
  • 好像不尊重 Joi.object().default()
【解决方案2】:

我将首先指出您问题中的架构不是有效的 JavaScript,在声明 keyC 的规则之前,您已经关闭了太多括号。我假设这只是问题的格式错误,并且您的实际架构当前有效。

其次,您声明默认值的方式没有任何问题。它工作得很好。我假设这是您验证架构的方式,这是问题所在。

尝试运行它。我模仿了the docs for default()中的验证方法。

const schema = Joi.object().keys({
    keyA: Joi.string().allow('').allow(null).default(null),
    keyB: Joi.object().keys({
        b1: Joi.string(),
        b2: Joi.string(),
        b3: Joi.object().keys({
            b3_1: Joi.string(),
            b3_2: Joi.string(),
            b3_3: Joi.string()
        })
    }).default({}),
    keyC: Joi.object().keys({
        c1: Joi.number(),
        c2: Joi.number(),
        c3: Joi.boolean(),
        c4: Joi.boolean()
    }).default({}),
    keyD: Joi.object().keys({
        d1: Joi.number(),
        d2: Joi.number()
    }).default({}),
    keyE: Joi.object().keys({
        e1: Joi.number()
    }).default({})
}).allow(null);

Joi.validate({
    keyA: "foo",
    keyD: {
        d1: 21.9,
        d2: 21.1
    },
    keyE: {
        e1: 42
    }
}, schema, (err, value) =>
{
    if (err)
        throw err;

    console.log(value);
});

我在控制台中得到了这个:

{
    keyA :'foo',
    keyD: {
        d1: 21.9,
        d2: 21.1
    },
    keyE: {
        e1: 42
    },
    keyB: {},
    keyC: {}
}

这些键看起来不太可能像您预期的输出那样有序,但这与object keys are not ordered 无关。

【讨论】:

  • 是的,你是对的 - 问题最终出在一个正在剥离空对象的外部库中。
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多