不存在使每个密钥都成为必需的标准方法,但有一些变通方法。
一种解决方法是在Joi.object() 上使用.requiredKeys() 和.optionalKeys()
看看.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);
因此,除非另有说明,否则您将需要每个键。