0

エンドポイントへの入力の有効な組み合わせを表すオブジェクトの配列があります。

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でオブジェクトの配列に対してオブジェクトをチェックする方法はありますか?

4

1 に答える 1

4

これを行う方法を理解しました。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(),
于 2016-07-06T18:19:53.560 に答える