我通过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
}
}
用:眼睛:在空物上。我在Joi.default()方法中缺少什么?我是否过度了解Joi的意思?
答案 0 :(得分:1)
首先,我要指出您的问题中的架构不是有效的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。
答案 1 :(得分:-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)