web-dev-qa-db-ja.com

express.js-単一行の複数ルートの単一ルーティングハンドラー

単一の関数呼び出しでこれを行う方法はありますか?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

何かのようなもの:

app.get("/", "/blabla", "/blablablabla", todo );

私はこれが構文の混乱であることを知っていますが、私が達成したいことのアイデアを与えるために、ルートの配列は素晴らしいでしょう!

誰もこれを行う方法を知っていますか?

87
Aronis Mariano

同じ機能を探しているときにこの質問に出会いました。

@Jonathan Ongは、上記のコメントで、パスに配列を使用することは推奨されていませんが、Express 4で明示的に説明されており、Express 3.xで機能すると述べています。試してみるものの例を次に示します。

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

requestオブジェクトの内部から、/hooplul/poo?bandle=froo&bandle=pee&bof=blargのパスで:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Paramsで何が起こるかに注意してください:現在のリクエストで使用されているかどうかにかかわらず、可能なすべてのパスのキャプチャグループとパラメータを認識します。

したがって、配列を介した複数のパスのスタックは簡単に実行できますが、paramsまたはキャプチャグループを介して使用されたパスから有用なものを選択したい場合、副作用はおそらく予測不可能です。おそらく冗長性/エイリアシングに役立つでしょう。その場合、非常にうまく機能します。

編集:@ c24wの答え もご覧ください。

編集2:これは適度に人気のある答えです。 ExpressJSは、ほとんどのNode.jsライブラリと同様に、移動可能なごちそうであることに留意してください。上記のルーティングは引き続き機能しますが(現時点では非常に便利な機能です)、リクエストオブジェクトの出力を保証することはできません(説明した内容とは確かに異なります)。慎重にテストして、目的の結果が得られることを確認してください。

92
Kevin Teljeur
app.get('/:var(bla|blabla)?', todo)

:varは、使用しないreq.paramを設定します。この場合、正規表現を設定するためにのみ使用されます。

(bla|blabla)は正規表現を一致するように設定するため、文字列blaおよびblablahと一致します。

?は正規表現全体をオプションにするため、/にも一致します。

52
Jonathan Ong

あなたが実際にパスの配列を渡すことができます、あなたが言ったように、それは素晴らしい動作をします:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
47
alex

Kevin's answer について詳しく説明するために、これは 4.x docs からのものです。

ミドルウェア関数が呼び出されるパス。次のいずれかです。

  • パスを表す文字列。
  • パスパターン。
  • パスに一致する正規表現パターン。
  • 上記のいずれかの組み合わせの配列

次のような があります。

これは、/abcd/xyza/lmn、および/pqrで始まるパスに一致します。

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
25
c24w

私はに行きました:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
6

元のルートのファイルが必要で、このように新しいルートを定義します

var user = require('./users');
router.post('/login', user.post('/login'));
0
Roman Mahrer