8

次のコードは、クエリ文字列なし、または1 つのクエリ文字列のみで機能します。言い換えれば、単に行くだけで/charactersすべての文字が返されます。ただし、クエリ文字列パラメーターを指定すると、/characters?gender=male男性の文字のみが返されます。

123、またはクエリ文字列なしで動作するようにこれを拡張するにはどうすればよいですか? ケースごとに8つまたは9つの異なるifステートメントを書くことは本当に避けたいと思います。$where句がnullorの場合、Mongoose が単純に無視することを期待undefinedしていましたが、そうではありません (コメントアウトされたコードを参照)。

  var gender = req.query.gender;
  var race = req.query.race;
  var bloodline = req.query.bloodline;

  var query = Character.find();

  if (gender)
    query = query.where('gender').equals(gender);
  if (race)
    query = query.where('race').equals(race);
  if (bloodline)
    query = query.where('bloodline').equals(bloodline);

  /*
  query
    .where('gender').equals(new RegExp('^' + gender + '$', 'i'))
    .where('race').equals(new RegExp('^' + race + '$', 'i'))
    .where('bloodline').equals(new RegExp('^' + bloodline + '$', 'i'));
  */

  query.exec(function(err, characters) {
    if (err) throw err;
    res.send(characters);
  });

編集: まあ、今のところ7つのif文でできると思います。誰かがよりエレガントな解決策を見つけない限り。

編集2:

みんなありがとう。この簡潔な解決策を達成するためにあなたの両方が私を助けてくれたので、1つの答えを選ぶのは難しいです. これが今の全体です。

var conditions = {};

for (var key in req.query) {
  if (req.query.hasOwnProperty(key)) {
    conditions[key] = new RegExp('^' + req.query[key] + '$', 'i');
  }
}

var query = Character.find(conditions);
query.exec(function(err, characters) {
  if (err) throw err;
  res.send({ characters: characters });
});
4

3 に答える 3

2

良い、

次のようなものをお勧めします。

var query = Character.find()
if(req.params.length < 0) {
  for(var key in req.params) {
    query.where(req.params[key]).equals(key);
  }
} else {
  // do something without query params
}

これは私がテストしていませんが、動作するはずです (少し変更する必要があるかもしれませんが、アイデアは得られます)。この解決策は、実際に params にあるものをチェックしないことです。そのため、適切なものだけが入ってくるか、for ループのどこかで検証するようにしてください。ただし、正規表現または if ステートメントが必要になります。

これがお役に立てば幸いです。

于 2013-10-30T21:05:41.073 に答える