Joi: автоматическая проверка аргументов функции

Я видел кодовую базу, в которой использовалась библиотека joi, например:

function f(a, b) {
  // ...
}

f.schema = {
  a: Joi.string().uuid().required(),
  b: Joi.number()
}

И тогда на свойство f.schema больше нигде не ссылались. Есть ли какая-то структура, которая выполняет автоматическую проверку аргументов функции, используя свойство schema? Гугление по этому поводу ничего не дало.


person fctorial    schedule 19.05.2020    source источник


Ответы (1)


Я не думаю, что можно сделать именно то, что вы здесь показываете, поскольку перегрузка вызова функции невозможна в Javascript, но есть способ сделать что-то очень похожее, используя Прокси.

Вот что мне удалось сделать. Мы создаем прокси-объект validated, который переопределяет поведение apply, соответствующее стандартным вызовам функций, а также методы apply и call.

Прокси проверяет наличие свойства schema в функции, а затем проверяет каждый аргумент, используя элементы массива schema.

const Joi = require('joi');

const validated = function(f) {
    return new Proxy(f, {
        apply: function(target, thisArg, arguments) {
            if (target.schema) {
                for (let i = 0; i < target.length; i++) {
                    const res = target.schema[i].validate(arguments[i]);
                    if (res.error) {
                        throw res.error;
                    }
                }
            }
            target.apply(thisArg, arguments)
        }
    })
}

const myFunc = validated((a, b) => {
    console.log(a, b)
});

myFunc.schema = [
    Joi.string().required(),
    Joi.number(),
];

myFunc('a', 2);
person Oursin    schedule 19.05.2020