簡體   English   中英

如何在Joi中檢查有效對象

[英]How to check for a valid object in Joi

我有一個對象數組,這些對象代表端點輸入的有效組合:

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(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(),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM