是否可以向“@hapi/joi”模式对象添加额外的逻辑?

Is it possible to add an additional piece of logic to a "@hapi/joi" schema object?

const Joi = require('@hapi/joi');

function validateInput(input)({
    const schema = Joi.object({
        username: Joi.string().alphanum().min(3).max(30).required(),
        numApples: Joi.number().min(1).max(5).required(),
        numOranges: Joi.number().min(1).max(5).required()
    });

    return schema.validate(input);
}

我想做的是,如果苹果和橙子的总数不等于 3 个或更多,则抛出一个错误。 是否可以使用@hapi/joi以这种方式添加自定义逻辑?

您可以定义一个新值 numApplesAndOranges 并将其设置为 numApples + numOranges,然后再将其包含在您的架构中。

您现在可以这样测试:numApplesAndOranges: Joi.number().min(3).required()

完整代码如下:

const Joi = require('@hapi/joi');

function validateInput(input)({
     const numApplesAndOranges = input.numApples + input.numOranges;

     const schema = Joi.object({
        username: Joi.string().alphanum().min(3).max(30).required(),
        numApples: Joi.number().min(1).max(5).required(),
        numOranges: Joi.number().min(1).max(5).required(),
        numApplesAndOranges: Joi.number().min(3).required()
    });

    return schema.validate({...input, numApplesAndOranges});
}

您可以执行类似以下操作:

const Joi = require('@hapi/joi');
function validateInput(input) {
    // custom validation function by hapi/joi
    const sum = function(fields = [], maxValue) {
        return function(value, helpers) {
            const sum = 0
            fields.forEach(f => {
                sum = sum + +input[f];
            });

            if (sum > maxValue) {
                return helpers.error('any.invalid');
            }
        }
    }

    const schema = Joi.object({
        username: Joi.string().alphanum().min(3).max(30).required(),
        numApples: Joi.number().min(1).max(5).required(),
        numOranges: Joi.number().min(1).max(5).required().custom(sum(['numApples', 'numOranges'], 3))
    });

    return schema.validate(input);

您可以在 Joi here 中了解有关自定义验证的更多信息。

希望对您有所帮助!