javascript - Joi 验证器条件模式

标签 javascript node.js hapi.js joi

我需要创建动态架构来使用 Joi validatornode js 中验证我的 api 请求查询取决于请求查询中的键。假设下面提到的模式是我的有效查询。

我使用的是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 个条件下完成呢?

最佳答案

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

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时,对象应该只有typefirstnamelastname

当类型值为2时,对象应该只有typesalarypension

当类型值为3时,对象应该只有typecreditdebit

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

关于javascript - Joi 验证器条件模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59861503/

相关文章:

javascript - 尝试获取 .each() 内元素的宽度

javascript - 来自 XMLHttpRequest 的空响应文本

javascript - Nodejs 中 yEnc 的错误处理

javascript - 如何在 app.get() 中将 $and 值从 getcondition 返回到 options.where?

javascript - Node.js 中多个事件监听器的代码效率

javascript - 使这个函数可以防御 null/空字符串等

javascript - 在注入(inject)的脚本中包含 JQuery

javascript - hapi.js 处理错误的最佳方式

node.js - MongoDB:未返回多个填充子文档

node.js - 同时调用带有缓存的 hapi 服务器方法会发生什么情况?