Joi-设置默认所需的所有内容吗?

时间:2019-05-02 09:48:07

标签: javascript node.js validation joi

我正在构建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来覆盖它。实际上,这似乎是明智的默认设置-但暂时将其保留。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

目前尚无一种标准的方法来制作所需的每个密钥,但是有一些解决方法。
解决方法之一是在.requiredKeys()上使用.optionalKeys()Joi.object()

看看.describe()函数,
它返回一个具有键flags的对象。
当某个键标记为“可选”时,我们得到flags.presence = 'optional'

使用该信息,您可以在每个键上调用.describe()并准备两个requiredKeyoptionalKeys数组

然后,您可以将这些数组分别传递到.requiredKeys().optionalKeys()

例如:
假设您将joi模式定义为:

const joiSchemaKeys = {
    thing1: Joi.string(),
    thing2: Joi.string().optional(),
    thing3: Joi.string(),
    thing4: Joi.string(),
    thing5: Joi.string().required()
};

然后您可以使用以下方法准备两个数组optionalKeysrequiredKeys

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'});