10

ルートの 1 つで次の検証があります。

payload: {
    keywordGroups: Joi.array().items(Joi.object().keys({
        language: Joi.string().required(),
        containsAny: Joi.array().items(Joi.string()).default([]).when('containsAll', { is: [], then: Joi.required() }),
        containsAll: Joi.array().items(Joi.string()).default([]).when('containsAny', { is: [], then: Joi.required() }),
        notContainsAll: Joi.array().items(Joi.string()).default([]),
        notContainsAny: Joi.array().items(Joi.string()).default([])
    })).required(),
}

少なくとも1つの文字列を含めるcontainsAnyか、含める必要があるようにしようとしています。が空のcontainsAll場合、少なくとも 1 つのアイテムが必要です。が空の場合は、少なくとも 1 つの項目を含める必要があります。containsAnycontainsAllcontainsAllcontainsAny

しかしJoi.when、オブジェクトの配列に関しては、実際には機能しないようです。

4

1 に答える 1

6

そうしないと、この問題Joi.alternatives()で説明されているように循環依存関係が作成されます。

is条件ではwhen()、空の配列ではなく Joi タイプを指定する必要があります。この例は機能します:

import * as Joi from 'joi';

var arraySchema = Joi.array().items(Joi.object().keys({
    first: Joi.array().items(Joi.number()).default([])
        .when('second', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}),
    second: Joi.array().items(Joi.number()).default([])
}));

var altArraySchema = Joi.array().items(Joi.object().keys({
    first: Joi.array().items(Joi.number()).default([]),
    second: Joi.array().items(Joi.number()).default([])
        .when('first', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}),
}));

var obj = [
    {
        first: [],
        second: []
    }
];

var finalSchema = Joi.alternatives(arraySchema, altArraySchema);

var result = Joi.validate(obj, finalSchema);

console.log(JSON.stringify(result, null, 2));

との両方が空であるため、変数objは検証に失敗します。どちらかを空にしないと、検証チェックに合格します。firstsecond

于 2015-11-19T14:37:12.190 に答える