Javascript 如何检查Joi中的有效对象

Javascript 如何检查Joi中的有效对象,javascript,joi,Javascript,Joi,我有一个对象数组,表示端点输入的有效组合: const portfolios = [ { "name": "portfolioA", "product": "productA" }, { "name": "portfolioB", "product": "productB" }, { "name": "portfolioB", "product": "productC" }, { "name": "portfolioC", "product": "productD" }, .

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

const portfolios = [
  { "name": "portfolioA", "product": "productA" },
  { "name": "portfolioB", "product": "productB" },
  { "name": "portfolioB", "product": "productC" },
  { "name": "portfolioC", "product": "productD" },
  ...
]
例如,用户可以使用“productA”请求“portfolioA”,但不能使用“productB”,或者可以使用“productB”或“productC”请求“portfolioB”

我将获得如下输入:

 portfolio: {
   name: "portfolioA",
   product: "productA"
 }
我希望能够以编程方式对照“公文包”中的有效对象检查此对象。我认为这可以使用
Joi.object().valid(公文包)
完成,但验证失败

我可以使用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对照对象数组检查对象?

我想出了方法。Joi9.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(),

我知道怎么做了。Joi9.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(),

非常感谢。我也在找这个,谢谢。我也在找这个。