Joi 验证将默认设置为空对象
Joi validation set default as empty object
我 运行 遇到了一个关于 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
}
}
我会在 return
中得到这个
{
keyA: "foo",
keyB: {},
keyC: {},
keyD: {
d1: 21.9,
d2: 21.1
},
keyE: {
e1: 42
}
}
用 :eyes: 观察空对象。 Joi.default() 方法缺少什么?我是否过度扩展了 Joi 的意义?
您可以设置默认值,您应该试试这个:
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)
首先我会指出您问题中的架构无效 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 无论如何。
我 运行 遇到了一个关于 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
}
}
我会在 return
中得到这个{
keyA: "foo",
keyB: {},
keyC: {},
keyD: {
d1: 21.9,
d2: 21.1
},
keyE: {
e1: 42
}
}
用 :eyes: 观察空对象。 Joi.default() 方法缺少什么?我是否过度扩展了 Joi 的意义?
您可以设置默认值,您应该试试这个:
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)
首先我会指出您问题中的架构无效 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 无论如何。