Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@SE-studying-now

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

More than 1 year has passed since last update.

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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
SE-studying-now
SE勉強中。 覚えたことのメモ等残していきたい。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?