0

私は再利用可能な node.js NavigationControllerクラスを作成しているので、他のサーバー側プロジェクトでこれを再利用できます。

これがユースケースです。

var navController = new NavigationController({
    routes : {
        '/user/:action/:anything' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController',
        '/:anything' : 'ErrorController'
    },
    ErrorController : 'ErrorController'
});
navController.init();

サーバーの要求に応じて、ユーザーはそのオブジェクトのこの関数を呼び出すことができます。

navController.navigate(req, res);

現在、これとコントローラーは正しく呼び出されています。URL に基づいて適切なコントローラー オブジェクトを呼び出す部分である、navigate(req, res)関数の下のものは、 getRouteByPath(path)という名前の関数として定義されます。このプライベート関数はルートを取得し、navigate(req, res)関数が呼び出すコントローラー クラス名を取得できるようにします。

var getRouteByPath = function(path) {
    for(var route in config.routes) {
        var routeRegex = '';

        var routeParts = route.split('/');

        for(var rp = 0; rp < routeParts.length; rp++) {

            // checking if route part starts with :
            if(routeParts[rp].indexOf(':') === 0) {

                // this is "anything" part
                routeRegex += '[/]?([A-Za-z0-9]*)';

            } else if(routeParts[rp] != "") {
                routeRegex += '[/]?' + routeParts[rp];
            }
        }

        var routeRegexResult = path.match(routeRegex);
        if(routeRegexResult) {
            console.log(routeRegexResult);
            return route;
        }
    }
    return null;
};

これが正しい方法であるかのように、私はこの機能についてあまりにも心配していますか?

4

2 に答える 2

2

いくつかの欠陥:

  • なぜスラッシュを文字クラス([/])として使用するのですか?それを行う必要はありません。正規表現リテラルでのみ、バックスラッシュ(のように/\//g)でエスケープする必要があります。/代わりに単一の「」を使用してください( new RegExp("/", "g"))。

  • .indexOf(<string>)==0動作しますが、文字列全体を検索するため、あまり効率的ではありません。あなたの場合、より良い使用はから始まりますroutePart.charAt(0)==":"

  • <string>.match(<string>)-一致させたくないので、新しいRegExpオブジェクトを作成して使用することをお勧めします-ルート文字列のみを返し、一致はないため、キャプチャグループを作成する必要もないと思います(大丈夫、ログに記録します)。.test

  • 全体がpath正規表現と一致するかどうかを確認しますか?^とを追加することを忘れないでください$。AppControllerの現在の正規表現も、のようなルートと一致し/user/app/exampleます。

  • スラッシュ(およびスラッシュのみ)がオプションであるのはなぜですか(/?)?これがあなたの望むものではないと思うだけでなく、次のような正規表現を構築するときに壊滅的なバックトラックへの扉を開きます/\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/

    それを回避するには、グループ全体をオプションにする必要があります(?:/([^/]*))?

  • また、呼び出すたびに正規表現を作成するのではなく、(初期化時に)正規表現を1回だけ作成し、キャッシュに保存する必要がありますgetRouteByPath。のコンパイルはRegExpコードのどこかに隠されていますが、実行する必要があります。

于 2012-07-18T15:02:04.120 に答える
0

いくつかのメモ:

routeRegex += '[/]?([A-Za-z0-9]*)';

は、ルートが存在//する場合と存在しない場合があり、一致する可能性があると述べて+*ます。

また_、Web ルートで許可されているため、

あなたの.split('/')、はルートからすべてを削除する/ので、分割リストに入れてはいけません

于 2012-07-18T15:03:23.577 に答える