Joi 验证数组中的总和

问题描述

我想验证给定的 JSON ,约束 expenditure 不得超过 credit

{
  "expenditure": {
    "house": 2,"electricity": 1,"phone": 12
  },"credit": 6
}
const Joi = require("joi");

const schema = Joi.object({

    expenditure: Joi.object({
        house: Joi.number().integer().min(0).max(5).optional(),electricity: Joi.number().integer().min(0).max(5).optional(),phone: Joi.number().integer().min(0).max(5).optional()
    }),credit: Joi.number().integer().min(0).max(15).greater(
        Joi.ref('expenditure',{"adjust": expenditure => {
            return expenditure.house + expenditure.electricity + expenditure.phone;
        }})
    )
});

以上代码适用于在对象范围内进行约束,但我需要对此类内容进行验证

[
    {
        "phone_allowance": 12
    },{
        "phone_allowance": 10
    },]

要确保数组中所有 phone_allowance 的总和永远不会超过某个给定值,请说 50

解决方法

您可以使用custom()

https://github.com/sideway/joi/blob/master/API.md#anycustommethod-description

Working Demo

var schema = Joi.array().items(
  Joi.object({
    phone_allowance: Joi.number()
  })
).custom((value,helpers) => {
  var total = value.reduce((a,b) => a + b.phone_allowance,0)

  if (total > 5) {
    return helpers.error('any.invalid');
  }

  return value;
});