【问题标题】:How to check for a valid object in Joi如何在 Joi 中检查有效对象
【发布时间】:2016-07-07 02:19:53
【问题描述】:

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

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

例如,用户可以使用“productA”而不是“productB”请求“portfolioA”,或者他们可以使用“productB”或“productC”请求“portfolioB”。

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

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

我希望能够以编程方式对照“投资组合”中的有效对象检查此对象。我认为这可以使用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 对照一组对象来检查对象?

【问题讨论】:

    标签: javascript joi


    【解决方案1】:

    我想出了如何做到这一点。 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(),
    

    【讨论】:

    • 谢谢。我也在找这个。
    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多