【问题标题】:Is it possible to add an additional piece of logic to a "@hapi/joi" schema object?是否可以向“@hapi/joi”模式对象添加额外的逻辑?
【发布时间】:2020-06-25 10:33:19
【问题描述】:
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 以这种方式添加自定义逻辑?

【问题讨论】:

    标签: node.js express joi


    【解决方案1】:

    您可以定义一个新值 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});
    }
    

    【讨论】:

      【解决方案2】:

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

      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 中了解有关自定义验证的更多信息。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2010-11-22
        • 2014-08-16
        • 2021-06-13
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2014-08-11
        相关资源
        最近更新 更多