javascript - 如何检查 Joi 中的有效对象

标签 javascript joi

我有一个对象数组,它们代表端点输入的有效组合:

const portfolios = [
  { "name": "portfolioA", "product": "productA" },
  { "name": "portfolioB", "product": "productB" },
  { "name": "portfolioB", "product": "productC" },
  { "name": "portfolioC", "product": "productD" },
  ...
]

例如,用户可以使用“productA”请求“portfolioA”,但不能使用“productB”请求“portfolioB”,或者可以使用“productB”或“productC”请求“portfolioB”。

我得到的输入将如下所示:

 portfolio: {
   name: "portfolioA",
   product: "productA"
 }

我希望能够以编程方式检查此对象与“portfolio”中的有效对象。我认为这可以使用 Joi.object().valid(portfolios) 来完成,但验证失败。

我可以使用when() 使用下面的模式手动检查每个项目,但是投资组合数组可以更改,我不想每次都更改验证代码。我宁愿只给它一个有效对象的数组。

portfolio: {
  name: Joi.string().required(),
  product: Joi.string().required()
    .when('name', { is: Joi.string().valid('portfolioA'), then: Joi.string().valid('productA') })
    .when('name', { is: Joi.string().valid('portfolioB'), then: Joi.string().valid(['productB', 'productC']) })
}

顺便说一下,当验证失败时,我会看到这个而不是字符串表示形式。

 \"portfolio\" must be one of [[object Object], [object Object], [object Object], [object Object], [object Object]

有什么方法可以使用 Joi 检查对象数组吗?

最佳答案

我想出了如何做到这一点。 Joi 9.0.0-0 包含一个名为 extends 的新方法,可以为我解决这个问题。

const portfolios = { ... }

const customJoi = Joi.extend({
  base: Joi.object(),
  name: 'portfolio',
  language: {
    isValid: `portfolio must be one of ${JSON.stringify(portfolios)}`
  },
  rules: [
    {
      name: 'isValid',
      validate(params, value, state, options) {
        const found = results.find(e => e.name === value.name && e.product === value.product);

        if (!found) {
          return this.createError('portfolio.isValid', { v: value, q: params.q }, state, options);
        }

        return found;
      }
    } 
  ]
});

然后在我的验证声明中我可以使用

    portfolio: customJoi.portfolio().isValid().required(),

关于javascript - 如何检查 Joi 中的有效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213731/

相关文章:

javascript - 现在还有人真正使用 DHTML 这个短语吗?

javascript - Node api请求返回数组,但尝试使用索引时出错

javascript - Joi 验证器条件模式

node.js - TypeScript Joi : Property 'validate' does not exist on type 'Root'

node.js - Hapi/Joi 验证错误日志

javascript - 如果 props 的数量大于 8,为什么 Node JS 对象创建的性能如此糟糕?

javascript - 如何在javascript中访问这个数组

javascript - 从另一个脚本访问 javascript 变量

validation - Joi 对象验证 : How to validate values with unknown key names?

json - Node.js/Hapijs - 在不命名键的情况下验证 JSON 对象有效负载中的所有键和值