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


107

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

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

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

何かのようなもの:

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

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

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


2
todoにルーティングするすべてのルートに一致する正規表現を記述し、その正規表現をエンドポイントとして使用できるはずです。散らかって見えるかもしれませんが、うまくいきます。正規表現がどうなるかわからないので、私はこれを答えとして投稿していません。これは、その方向へのより多くのプッシュです。次のドキュメントの正規表現の使用についての言及があります:expressjs.com/api.html#app.VERB
Nick

私はJSで正規表現を使った経験はありません...試してみてください...しかし、他のオプションは大歓迎です!
Aronis Mariano 2013

1
私にも多くはありません。正直に言って、あなたにそれを与えなかったのは正直なところですが、私の理解は、正規表現はかなり普遍的であるということです。Expressは、他の言語とほとんど同じように式を解析します。
Nick Mitchinson 2013年

1
正規表現は非常に強力であり、間違いなく学ぶ価値があります。これが解決策です:app.get(/ ^ \ /((blabla){0,2})$ /、function(req、resp){var matching = req.params [0]; resp .set( 'Content- type '、' text / plain ').send( "Matched:'" + matched + "'");}); いくつかのこと:1.正規表現は/で始まり、/で終わるため、/文字はエスケープする必要があります。2. ^文字は文字列の先頭に一致し、$文字は文字列の末尾に一致します。それらがなければ、パスの最初または最後に余分な文字がある場合でも一致は成功します。つまり、/ x / blablaxxx
John Deighan

回答:


130

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

上記のコメントで述べた@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:これは中程度の人気の答えです。ほとんどのNode.jsライブラリと同様に、ExpressJSは移動可能なごちそうであることを覚えておいてください。上記のルーティングは引き続き機能しますが(現時点では非常に便利な機能を使用しています)、リクエストオブジェクトの出力を保証することはできません(これまでに説明したものとは異なります)。慎重にテストして、目的の結果が得られることを確認してください。


魅力のように機能します。ありがとう。
OrAssayag

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

:varreq.param使用しないものを設定します。この場合にのみ使用され、正規表現を設定します。

(bla|blabla)一致する正規表現を設定するため、文字列blaandと一致しますblablah

?正規表現全体をオプションにするので、一致/します。


1
/bla(bla)?も機能しますが、その後のパラメータは適切に入力されません(つまり、/bla(bla)?/:valueは入力されませんreq.params.value)。誰もがなぜ知っていますか?
joscarsson 2015年

エクスプレスを使用している場合はそれを取得できreq.params.varますがreq、関数に渡されたことを確認する必要があります
Matt The Ninja

51

あなたが言及したように、実際にはパスの配列を渡すことができ、それはうまくいきます:

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

28
廃止予定のこれに代わるものは何ですか?
brandonscript 2014

5
あなたは、これは推奨されませんと言う@JonathanOng、とレムスは、交換に何を求めています。彼/彼女の質問に答えてもらえますか?
nbro 2015年

router.route(['/ mailer / out / system'、 '/ mailer / out / payment'])はExpress 4で問題なく機能しています。非推奨の警告はありません
danday74

2
@JonathanOngが配列を使用して現在のExpress v4ドキュメントを参照している場合、非推奨ではないようです。
Jason

32

ケビンの答えを詳しく説明するために、これは4.xドキュメントからです:

ミドルウェア機能が呼び出されるパス。次のいずれかになります。

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

次のような例があります。

これは始まるパスと一致します/abcd/xyza/lmn、と/pqr

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


-2

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

var user = require('./users');
router.post('/login', user.post('/login'));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.