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を順にチェック
}]
};