2013-03-11 14 views
63

単一の関数呼び出しでこれを行う方法はありますか?express.js - 1行の複数のルートに対する単一のルーティングハンドラ

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

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

ような何か:

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

私はこれが構文混乱ですけど、ちょうど私が達成したいかのアイデアを与えるために、ルートの配列は素晴らしいだろう!

誰でもこの方法を知っていますか?

+2

あなたが望むすべてのルートと一致します正規表現を記述することができるはずですtodoにルーティングし、正規表現をエンドポイントとして使用します。それは厄介に見えることがありますが、それは動作します。私は正式な表現が何であるかわからないので、これを答えとして掲示するつもりはありません。そして、これはその方向へのより多くのプッシュです。ここでは正規表現を使って言及しています:http://expressjs.com/api.html#app.VERB –

+0

JSの正規表現では経験がありません。オプションは大歓迎! –

+1

私はあまりお持ちではありませんが、正直なところ私はあなたにそれをあげていませんでしたが、私の理解では正規表現はかなり普遍的です。 Expressは他の言語とほとんど同じように式を解析する必要があります。 –

答えて

46

同じ機能を探している間、私はこの質問に出くわしました。

@Jonathan Ongは、パスの配列を使用することは推奨されていませんが、Express 4で明示的に説明されており、Express 3.xで動作します。 requestオブジェクトの内側から

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

    } 
); 

/hooplul/poo?bandle=froo&bandle=pee&bof=blargのパスに:のparamsで何が起こるか

"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の回答belowもご覧ください。

編集2:これは適度に一般的な回答です。 ExpressJSは、ほとんどのNode.jsライブラリと同様に、可動式のものです。上記のルーティングはまだ機能していますが(私は現時点で非常に便利な機能です)、要求オブジェクトの出力を保証することはできません(これは私が記述したものとはまったく異なります)。希望の結果が得られるように慎重にテストしてください。

48
app.get('/:var(bla|blabla)?', todo) 

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

(bla|blabla)は一致する正規表現を設定するので、文字列blablablahと一致します。

?は、正規表現全体を任意にするため、/にも一致します。

+1

'/ bla(bla)? 'でも動作しますが、後のパラメータは正しく設定されません(つまり、'/bla (bla)?/:value'は 'req.params.value'に値を設定しません)。誰でも知っている理由は? – joscarsson

+0

expressを使用している場合は 'req.params.var'で取得できますが、' req'が関数 –

42

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

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

LOL rlyに渡されていることを確認する必要があります...これをテストする必要があります! –

+1

は動作しません.. –

+17

これをしないでください、それは非難されました –

14

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

ミドルウェア機能が呼び出されるため、パス。次のいずれかを指定できます。

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

彼らは含めて、いくつかexamplesを持っている:

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

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

は、元のルートのファイルを必要とし、私が行ってきました。この

var user = require('./users'); 
router.post('/login', user.post('/login')); 
4

などの新しいルートを定義します。

['path', 'altPath'].forEach(function(path) { 
    app.get(path, function(req, res) { etc. }); 
}); 
関連する問題