sql >> データベース >  >> NoSQL >> MongoDB

複数のパスが一致する場合、Expressはどのルーターパスを使用するかをどのように知るのですか?

    これを完全に理解するには、ドキュメントをお読みください: http://expressjs.com/api.html #router.METHOD

    エクスプレスルートがパスをキャプチャする方法

    :paramを使用する場合 パスの一部として、/*などのすべてに一致します 、キャプチャされた値はreq.params.paramに保存されます 。

    複数のルールがある場合、最初に登録されたルールが最初にチェックされます。一致するものが見つかるまで、各ルールに対して各呼び出しをチェックします。 next()を呼び出す場合 値が渡されない場合、次の一致を検索します(同じルートで、または次のミドルウェアに進みます)。

    したがって、これら3つのルールはすべて実行されます

    var handleRoute = function(req, res, next){
       console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
       next();
    }
    
    route.route('/user/:id').get(handleRoute);
    route.route('/user/:user').get(handleRoute);
    route.route('/user/*').get(handleRoute);
    

    /user/foobarをリクエストすると 、次の出力が表示されます(おそらく、応答しなかったため、クライアントとしてエラーが発生します:P)

    /user/foobar foobar undefined undefined
    /user/foobar undefined foobar undefined
    /user/foobar undefined undefined foobar
    

    3つすべてにヒットしますが、コンテキストはそれぞれ異なります。

    正規表現を使用してパスパターンをキャプチャする方法

    id(たとえばすべての数字)とユーザー名(すべての文字)の別々のルートをキャプチャする場合は、次のように実行できます。

    var handleRoute = function(tag) {
      return function(req, res, next) {
        console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
        res.status(200)
          .json({
            success: 'yay!'
          });
      };
    };
    
    route.route(/^\/user\/([0-9]+)$/i)
      .get(handleRoute('id'));
    route.route(/^\user\/([A-Za-z]+)$/i)
      .get(handleRoute('user'));
    route.route('/user/*')
      .get(handleRoute('catch all'));
    

    私のキャプチャグループの周りのパラセシスに注意してください。これがないと、params 空です。 *だけで自動キャプチャします 彼らはいい人だからです。 3つの異なるタイプに対して実行すると、次の出力が得られます。

    id /user/123 -> 123
    user /user/user -> user
    catch all /user/user.1 -> user.1
    

    それがすべてを説明しているので、あなたはバグがあなたのシステムに蔓延するためのいくつかのベクトルに自分自身を開いています。あなたのURLパターンについて考えたいかもしれません。




    1. MongoDB-オブジェクト?なぜ集約して_idが必要なのですか

    2. リレーショナルDBがメモリ内にありますか?

    3. redisキャッシュが機能しているかどうかをテストするにはどうすればよいですか?

    4. Javascriptを使用してギリシャ文字を使用してMongoDBでクエリを実行すると、結果が返されません