0

nodeJS、MongoDB、および Express を使用して、API (REST) の一般的なクエリ メソッドに取り組んでいます。

ルートがリクエストをモジュールに転送した後、リテラルクエリを実行すると、すべてが期待どおりに機能します。例でクエリを実行していますが、正規表現または SQL 用語で「like」を使用してクエリを実行したい場合、それを機能させることができません。

モジュール内で Express を使用する find メソッドは次のとおりです。

exports.findByQuery = function(req, res) {
   collection.find( req.query).toArray(function(err, docs); 
}

これは期待どおりに機能しますが、T を持つすべてのユーザー名を検索するために正規表現を使用してフィールドをクエリする場合は、常に .query JSON オブジェクトを次のように "" を含む文字列として取得します。

{"username":"/T/"}

それ以外の :

{username:/T/}

req.query は GET リクエストから来ています。

私が置き換えた場合:

 collection.find( req.query).toArray(function(err, docs);

と:

 collection.find( {username:/T/} ).toArray(function(err, docs);

それは正常に動作します!.

.find を実行する前に、サニタイズまたは req.query への変換メソッドを実行する必要があると思いますが、何も見つかりません。手がかりや助けをいただければ幸いです。

よろしくお願いします。

4

1 に答える 1

0

解決策を見つけました。

質問の下のコメントで説明されているように、オブジェクトを直接 RegExp に変換できませんでした。私がしたことは、mongo の適切にフォーマットされた正規表現クエリを返すヘルパー関数を作成し、.find を実行することです。

したがって、検索結果は次のようになります。

exports.findByQuery = function(req, res) {
    var query = req.query;
    db.collection('users', function(err, collection) {
                collection.find( parseRegExpProperties(query) ).toArray(function(err, docs) {
            res.send(docs);
        });
    });
};

そして、これが parseRegExpProperties メソッドです。これがどれほど安全かはわかりませんが、少なくとも私にとってはスタートです:

function parseRegExpProperties(obj) {
   var newObject = {};
   for(var propName in obj) {
      if(typeof(obj[propName]) != "undefined") {
        newObject[propName] = {'$regex': obj[propName], '$options': "i"};
      }
   }
   return newObject;
}

誰かがパフォーマンスに関してコメントを持っている場合、またはこれがどれほど安全かについて、それは大歓迎です!

于 2013-06-09T17:25:00.593 に答える