2017-11-02 16 views
0

Express(v4.15)ルーティングでOR条件付きの正規表現を指定するにはどうすればよいですか?Express:論理式またはルーティング式

は、私は次のルートは(私はなしにしようとしたとき、私は次のエラー

SyntaxError: Invalid regular expression: /^\/(?(?:([^\/]+?))|media|movies)\/(?:([^\/]+?))\/?$/: Invalid group 

を得た

app.get('/(video|media|movies)/:videoId', this.redirectToVideo.bind(this)); 

しようとしたのと同じ方法

/video/:videoId 
/movies/:videoId 
/media/:videoId 

を指すようにしたいです)

app.get('/video|media|movies/:videoId', this.redirectToVideo.bind(this)); 
最初の2つのルートが動作し

ではなく、1つの

/media/:videoId 

おかげ

+0

バックスラッシュを '/'としてスラッシュ '/'をエスケープする必要があります。これを使う: '\ /(video | media | movies)\ /:videoId' – ctwheels

+0

また、あなたが得ているエラーは別の正規表現のようです? (?:(?^ \ /] +?))| \ |?$ '最初の非捕捉グループには疑問符 '(?:...)の後に': 'がありません。捕捉グループである場合は疑問符'? 'を '(...)'として取り除きます – ctwheels

答えて

1

ダミーparamは動作するはずの使用:

app.get('/:prefix(video|media|movies)/:videoId', ...); 

ルートパスから正規表現を生成するために使用されるプロセスは少し予測不可能です。

2

私はちょうどあなたのルートの配列を使用します。

app.get(['/video/:videoId', '/movies/:videoId', '/media/:videoId'], this.redirectToVideo.bind(this)) 

編集:

をした場合あなたはRegexを使いたいと思っていますが、これもうまくいくでしょう:

app.get('(\/video|\/media|\/movies)/:videoId', this.redirectToVideo.bind(this))) 
+0

ありがとう。私は反復を避けるため、スカリーの答えを使用すると思います。複雑なルートを読むのがはっきりしています。 +1 – David