【问题标题】:How to access key outside of array in when condition of JOI schema validationJOI模式验证条件下如何访问数组外的键
【发布时间】:2016-01-19 03:34:25
【问题描述】:

我有一个问题。

"Formula": {
    "Type": "Import/Export",
    "Params": {
        "ShippingSourceType": "System/Country/Group",
        ShippingDestinationType:"System/Country/Group"
    }
}

我有上面的对象,我必须对类型进行验证。但Type 取决于参数中的ShippingSourceTypeShippingDestinationType

如果ShippingSourceType 是系统,那么Type 应该是Export。 如果ShippingDestinationType 是系统,那么类型应该是Import

我已经验证了类型如下:

Type: joi.alternatives().required()
    .when('Params.ShippingSourceType', { is: 'System', then: joi.string().valid('Export') })
    .when('Params.ShippingDestinationType', { is: 'System', then: joi.string().valid('Import') })

但它没有用。你能建议如何解决这个问题吗?

【问题讨论】:

  • 嗨,Bhushan,您能告诉我们您使用的是哪个版本的joi?你也可以提供一个失败的例子,比如一个应该被验证但没有被验证的对象,或者一个不应该被验证但被验证的对象?
  • @Almouro 我已经更新了我的问题。你能帮帮我吗?
  • 我认为您的验证没有任何问题。我什至运行了small file validating some objects,它按预期进行了验证。我使用了最新版本的 Joi,又名 7.0.1。你用的是哪个版本?
  • @Almouro 抱歉,当它不起作用时我忘了添加。如果 Shipping SourceType 和 ShippingDestinationType 都不是系统的,那么它应该允许 Type 采取 Import 或 Export。但在这种情况下,它给出了不匹配任何允许的替代方案,这是正确的,因为我没有提到它的条件。那么我应该设置什么条件来处理这种情况呢?

标签: javascript hapijs joi


【解决方案1】:

原来这是a bug with Joi

已推送提交以修复它,但将在版本 8 中发布。

同时,您可以通过从特定提交安装 Joi 来使用它,如下所示:

npm install --save git+https://github.com/hapijs/joi.git#5b60525b861a3ab99123cd8349cbd9f6ed50e262

然后,你可以使用:

var joi = require('joi');

var schema = joi.object({
  Formula: joi.object().keys({
    Type: joi.string() // Use joi.string()
      .when('Params.ShippingSourceType', { is: 'System', then: joi.string().valid('Export')})
      .when('Params.ShippingDestinationType', { is: 'System', then: joi.string().valid('Import')}),
    Params: joi.object(), // or additional validation
  }),
});

现在一切都按预期进行:

joi.validate({
  Formula: {
    Type: "Export",
    Params: {
      ShippingSourceType: "System",
      ShippingDestinationType:"Country"
    }
  }
}, schema, function (err, value) {
  // If I understood correctly, this should be valid
  console.log(err ? 'object invalid' : 'object valid');
});

joi.validate({
  Formula: {
    Type: "Import",
    Params: {
      ShippingSourceType: "System",
      ShippingDestinationType:"Country"
    }
  }
}, schema, function (err, value) {
  // If I understood correctly, this should be invalid since
  // ShippingSourceType == "System" => Type == "Export"
  console.log(err ? 'object invalid' : 'object valid');
});

joi.validate({
  Formula: {
    Type: "Import",
    Params: {
      ShippingSourceType: "Country",
      ShippingDestinationType:"System"
    }
  }
}, schema, function (err, value) {
  // If I understood correctly, this should be valid
  console.log(err ? 'object invalid' : 'object valid');
});

joi.validate({
  Formula: {
    Type: "Export",
    Params: {
      ShippingSourceType: "Country",
      ShippingDestinationType:"System"
    }
  }
}, schema, function (err, value) {
  // If I understood correctly, this should be invalid since
  // ShippingDestinationType == "System" => Type == "Export"
  console.log(err ? 'object invalid' : 'object valid');
});

joi.validate({
  Formula: {
    Type: "Export",
    Params: {
      ShippingSourceType: "Country",
      ShippingDestinationType:"Country"
    }
  }
}, schema, function (err, value) {
  // Should be valid
  console.log(err ? 'object invalid' : 'object valid');
});

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2017-07-28
    相关资源
    最近更新 更多