29

の形式でパーマリンクを実装しようとしてい/2013/02/16/title-with-hyphensます。ルートパラメータを使用したいのですが。次のルートを試してみると:

app.get('/:href', function(req, res) { });

...次に、404を取得します。これは、おそらくExpressが1つのパラメーターのみを検索し、4つあると考えているためです。

で回避できます/:y/:m/:d/:tが、これによりパーマリンクが永続的にその形式になります。

ルートパラメータにスラッシュを含めるにはどうすればよいですか?

4

4 に答える 4

33

文字列の代わりに正規表現を使用します。

app.get(/^\/(.+)/, function(req, res) {
    var href = req.params[0]; // regexp's numbered capture group
});

文字列構文 ( ) は使用できないことに注意してください。Expressapp.get('/:href(.+)')では、ルート文字列で正規表現の小さなサブセットしか許可されておらず、これらの正規表現をルートの特定のコンポーネントの条件チェックとして使用するためです。条件で一致したコンテンツを取得することも、コンポーネント (スラッシュで区切られた URL の一部) をまたいで一致させることもできません。

例えば:

app.get('/:compa([0-9])/:compb([a-z]/')

このルートは、最初のコンポーネント ( compa ) が 1 桁の数字で、2 番目のコンポーネント ( compb ) が 1 文字の az である場合にのみ一致ます

'/:href(.+)'「コンテンツが何かの場合にのみ最初のコンポーネントに一致する」と言いますが、これはあまり意味がありません。とにかく、それがデフォルトの動作です。さらに、sourceを調べると、Express が実際にその条件のドットをリテラルに強制していることがわかります。

たとえば、app.get('/:href(.+)')実際には次のようにコンパイルされます。

 /^\/(?:(\.+))\/?$/i

your がエスケープされていることに注意してください.。したがって、このルートは 1 つ以上のピリオドにのみ一致します。

于 2013-02-16T22:03:01.473 に答える
1

正規表現ルーティングでこれを行うことができます

app.get('/:href(\d+\/\d+\/\d+\/*)', function(req, res) { });

正規表現が正しいかどうかはわかりませんが、アイデアはわかります

編集:

上記は機能しないと思いますが、これは機能します

app.get(/^\/(\d+)\/(\d+)\/(\d+)\/(.*)/, function(req, res) { });

http://localhost:3000/2012/08/05/hello-i-must-beイールドに行くreq.params = [ '2012', '08', '05', 'hello-i-must-be' ]

于 2013-02-16T22:03:57.060 に答える