我正在构建Node / Express API,并使用Joi进行验证。这是一个很棒的程序包,非常有用。但是,我们已经厌倦了执行以下操作:
const mySchema = joi.object({
thing1: joi.string().required(),
thing2: joi.string().required(),
thing3: joi.string().required(),
thing4: joi.string().required(),
thing5: joi.string().required(),
}).required();
我们希望默认情况下需要所有 ,然后手动调用.optional
来覆盖它。实际上,这似乎是明智的默认设置-但暂时将其保留。
有没有办法做到这一点?
答案 0 :(得分:0)
目前尚无一种标准的方法来制作所需的每个密钥,但是有一些解决方法。
解决方法之一是在.requiredKeys()
上使用.optionalKeys()
和Joi.object()
看看.describe()
函数,
它返回一个具有键flags
的对象。
当某个键标记为“可选”时,我们得到flags.presence = 'optional'
使用该信息,您可以在每个键上调用.describe()
并准备两个requiredKey
和optionalKeys
数组
然后,您可以将这些数组分别传递到.requiredKeys()
和.optionalKeys()
。
例如:
假设您将joi模式定义为:
const joiSchemaKeys = {
thing1: Joi.string(),
thing2: Joi.string().optional(),
thing3: Joi.string(),
thing4: Joi.string(),
thing5: Joi.string().required()
};
然后您可以使用以下方法准备两个数组optionalKeys
和requiredKeys
:
const initialKeyInformation = {
requiredKeys: [],
optionalKeys: []
};
const prepareKeysInformation = keys =>
Object.keys(keys).reduce((accumulated, aKey) => {
const description = keys[aKey].describe();
const isMarkedOptional =
description.flags &&
description.flags.presence &&
description.flags.presence === "optional";
if (isMarkedOptional) {
console.log(`"${aKey}" is marked optional`);
accumulated.optionalKeys.push(aKey);
} else {
console.log(`"${aKey}" is not marked, making it required`);
accumulated.requiredKeys.push(aKey);
}
return accumulated;
}, initialKeyInformation);
const { optionalKeys, requiredKeys } = prepareKeysInformation(joiSchemaKeys);
完成后,您可以准备joi模式,如下所示:
const schema = Joi.object()
.keys(joiSchemaKeys)
.requiredKeys(requiredKeys)
.optionalKeys(optionalKeys);
这样,除非另有说明,否则您将需要每个密钥。
答案 1 :(得分:0)
默认情况下,您可以使用precence
选项设置必填字段。示例:
const mySchema = joi.object({
thing1: joi.string().required(),
thing2: joi.string().required(),
thing3: joi.string().required(),
thing4: joi.string().required(),
thing5: joi.string().required(),
}).options({presence: 'required'});