使用 Joi 库进行复杂验证

Complex validation using Joi library

我有这个json:

let purchaseSubscription = {
  'metadata': {
    'eventName': 'PurchaseSubscription',
    'type': 'setup' // setup, repurchase or recurring
  },
  'data': {
    'subscriptionId': '447481',
    'subscriptionTrialId': '23542'
  }
};

如果 metadata.type 具有值 setup 那么 data.subscriptionTrialId 应该被验证是否存在并且是一个数字。 如果metadata.type有其他值,则data.subscriptionTrialId可以忽略。

这是我目前拥有的:

const Joi = require('joi');
const validTypes = ['setup', 'repurchase', 'recurring'];

exports.schema = Joi.object().keys({
  metadata: Joi.object({
    eventName: Joi.string().required(),
    type: Joi.string().valid(validTypes).required()
  }).required(),
  data: Joi.object({
    subscriptionId: Joi.number().integer().min(1).max(2147483647).required(),
    subscriptionTrialId: Joi.when(
        'metadata.type', { is: 'setup', then: Joi.required() })
  }).required()
}).options({ 'allowUnknown': true });

但我没有得到想要的结果。 data.subscriptionTrialId 始终有效,无论我在 metadata.type

下有什么

我尝试阅读 documentation,但无法正常工作 :(

您可以在 JOI 架构中使用 otherwise 键。

声明之前代码中的某处exports.schema:

const trialIdRequired = Joi.object({
    subscriptionId: Joi.number().integer().min(1).max(2147483647).required(),
    subscriptionTrialId: Joi.required()
  }).required()

const trialIdNotRequired = Joi.object({
   subscriptionId: Joi.number().integer().min(1).max(2147483647).required(),
    subscriptionTrialId: Joi.any()
})

然后在data字段中添加when子句

data: Joi.when(
        'metadata.type', 
        { 
            is: 'setup', 
            then: trialIdRequired,
            otherwise: trialIdNotRequired
        })