LoginSignup
1
1

More than 3 years have passed since last update.

express-validatorでワイルドカードを使用する際の注意

Posted at

express-validatorでワイルドカードを使用したチェックを実装時に気付いた挙動をメモ。

ワイルドカードを指定する箇所そのもののチェックはできない

param.*の対象はプロパティ名ではない
let check = [query("param.*", "error message").isString()];  // チェックの定義
// ↓チェック対象オブジェクト
queryObject = {
  param: {
    id: "abc",   // param.*とした場合、idは対象外(何故か判定は行われる)
    name: "efg"  // param.*とした場合、nameも対象外(何故か判定は行われる)
  }
};

custom判定を定義してデバッグしてみると、判定処理自体は行われるのがわかるが、falseを返却しようが、Errorをスローしようが、スルーされる。

判定処理自体は行われる
let check = [query("param.*", "error message").custom(value => {
  if (value === "abc") return false;                     // チェックは行われるが無視される
  if (value === "efg") throw new Error("error thrown");  // チェックは行われるが無視される
})];  // チェックの定義
// ↓チェック対象オブジェクト
queryObject = {
  param: {
    id: "abc",   // param.*とした場合、idは対象外(何故か判定は行われる)
    name: "efg"  // param.*とした場合、nameも対象外(何故か判定は行われる)
  }
};

ワイルドカードをクエリパラメータに対して「param.*」のように使用した場合、クエリパラメータparamの数によって挙動が変わる

クエリパラメータparamが単一の場合、paramの文字1文字づつがチェック対象となる。

paramが単一の場合
let check = [query("param.*", "error message").isString()];  // チェックの定義
// ↓チェック対象オブジェクト
queryObject = {
  param: "abc" //["a","b","c"]のように1文字ずつチェックする
};

クエリパラメータparamが複数の場合、各paramの値がチェック対象となる。

paramが複数の場合
let check = [query("param.*", "error message").isString()];  // チェックの定義
// ↓チェック対象オブジェクト
queryObject = {
  param: ["abc", "def", "ghi"]  // "abc"→"def"→"ghi"を順にチェック
};

ドキュメントの例を見る限り、「param.*.id」というような使い方が正しい使い方で、「param.*」とするのは非推奨と思われる。。。
(恐らくワイルドカードの対象が、プロパティ名ではなく添え字(0,1,2…)であるから、と考える。)

推奨されている指定方法とオブジェクトの関係
let check = [query("param.*.id", "error message").isString(), query("param.*.name", "error message").isString()];  // チェックの定義
// ↓チェック対象オブジェクト
queryObject = {
  param: [{
    id: "abc",   // param.*.idと指定でparamの中のidを順にチェック
    name: "efg"  // param.*.nameと指定でparamの中のidを順にチェック
  },{
    id: "hij",   // param.*.idと指定でparamの中のidを順にチェック
    name: "klm"  // param.*.nameと指定でparamの中のidを順にチェック
  }]
};
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1