web-dev-qa-db-ja.com

Joiオブジェクトの検証:不明なキー名の値を検証する方法は?

私はおそらく知ることができないキー名を持つオブジェクトがあります-それらはユーザーによって作成されます。しかし、私はそれら(キー)が格納する値と、それら(値)がISO文字列になることを知っています。これらの値を検証するにはどうすればよいですか?そして、オプションで、不明なオブジェクトのキーを検証するにはどうすればよいですか?

_ key: Joi.string().min(2).max(25)
_

私がすでに試したことはJoi APIドキュメントに基づいていました:

プレーンなJSオブジェクトの代わりにJoi.object([schema])を使用するもう1つの利点は、不明なキーを許可するなどのオブジェクトのオプションを設定できることです。

const schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2));

例から理解したことは、argキーはJoi.object()keyを表し、valuevalueを表すということです。

私の例:

_campaign: Joi.object({
  arg: Joi.string().valid( 'unknown' ),
  value: Joi.date().iso(),
}).pattern( /unknown/, Joi.string().min(2).max(25) )
_

私の入力;

_campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" }
_

私のエラー:

[「g_ad_adwords」は許可されていないため、「キャンペーン」は失敗します]

14
wscourge

これを試して。基本的にはオブジェクト内のすべてのキーを受け入れますcampaignと値はJoi.date().iso()に対して検証する必要があります

campaign: Joi.object().pattern(/^/, Joi.date().iso())

ただし、これはanyキーに一致します。正規表現を少しパディングすることでこれを制限できます。例えば2〜25文字のWord文字のみ

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso())

更新

Joiのドキュメントの については、まだテストしていませんが、これが私の解釈です。彼らが与えた最も簡単な例ではないことは理解できます...

const schema = Joi.object({
    arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'),
    value: Joi.string(),
}).pattern(/firstname|lastname/, Joi.string().min(2));

検証するオブジェクトmustには、2つの属性argvalueが含まれている必要があります。argの値は1つでもかまいません'firstname', 'lastname', 'title', 'company', 'jobtitle'およびvalueは単なる文字列です。

{
    arg: 'firstname',
    value: 'john'
}

{
    arg: 'lastname',
    value: 'smith'
}

{
    arg: 'jobtitle',
    value: 'brewer'
}

ただし、オブジェクトに属性firstnameおよびlastnameを設定することもできます。これらの値はどちらも2文字を超える文字列です。したがって、上記の例は1つの有効なオブジェクトに圧縮できます。

{
    firstname: 'john',
    lastname: 'smith',
    arg: 'jobtitle',
    value: 'brewer'
}
19
Ankh