使用Joi库进行复杂的验证

时间:2019-03-25 16:32:33

标签: javascript node.js joi

我有这个json:

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

如果元数据。类型的值为设置 然后应验证 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 });

但是我没有得到期望的结果。不管我在 metadata.type

下有什么内容, data.subscriptionTrialId 总是经过验证。

我尝试阅读documentation,但无法使其起作用:(

1 个答案:

答案 0 :(得分:1)

您可以在JOI模式中使用arr[5]>arr[7]键。

在声明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() }) 字段中添加when子句

data