Joi 验证器条件模式

新手上路,请多包涵

我需要创建动态模式来验证我在 node js 中的 api 请求查询,使用 Joi 验证器 取决于请求查询中的键。说下面提到的模式是我的有效查询。

我正在使用 hapi/joi 版本 16.1.8

组合1

 { type: 1, firstname: 'user first name', lastname: 'user last name'}

组合2

 { type: 2 , salary: 1000, pension: 200}

组合3

 { type: 3 , credit: 550, debit: 100}

如您所见,对象键因 type 的值而异。如何正确处理?

我们可以使用 Joi.alternatives 处理两种情况,例如

const schema = Joi.alternatives().conditional(Joi.object({ type: 1 }).unknown(), {
    then: Joi.object({
        type: Joi.string(),
        firstname: Joi.string(),
        lastname: Joi.string()
    }),
    otherwise: Joi.object({
        type: Joi.number(),
        salary: Joi.any(),
        pension: Joi.any()
    })
});

但是如何在 3 个条件下做到这一点呢?

原文由 Nitheesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 733
2 个回答

我以不同的方式实现了同样的目标。在这里发布相同的内容,因为这可能对将来的某人有用。

 const schema = Joi.object({
    type: Joi.number().required().valid(1, 2, 3),
    firstname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
    lastname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
    salary: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
    pension: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
    credit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
    debit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
}))

这如预期的那样完美地工作。

当类型值为 1 firstname 只有 type lastname

当类型值为 pension 2 salary 只有 type

当类型值为 3 debit credit type

任何其他组合都将从 joi 验证器中间件层作为错误抛出。此外,除 1、2 和 3 之外的任何其他类型值都将引发错误。

原文由 Nitheesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

这个对我有用!

 var Joi = require('joi');

var schema = {
    a: Joi.any().when('b', { is: 5, then: Joi.required(), otherwise: Joi.optional() }),
    b: Joi.any()
};

var thing = {
    b: 5
};
var validate = Joi.validate(thing, schema);

// returns
{
    error: null,
    value: {
        b: 5
    }
}

这是 参考

原文由 soamazing 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题