2017-11-02 8 views
0

Wie kann ich einen regulären Ausdruck mit OR-Bedingungen in Express (V4.15) Routing angeben?Express: logisch oder in Routing

Ich möchte die folgenden Strecken nach der gleichen Methode zeigen

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

Als ich versuchte,

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

ich folgende Fehlermeldung bekam

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

Wenn ich ohne die versuchten ()

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

die ersten 2 Routen arbeiten, aber nicht, dass man

/media/:videoId 

Dank

+0

Sie müssen den Schrägstrich '/' mit einem umgekehrten Schrägstrich als '\ /' umgehen. Verwenden Sie dies: '\/(Video | Medien | Filme) \ /: videoId' – ctwheels

+0

Auch der Fehler, den Sie bekommen, scheint für eine andere Regex zu sein? '^ \/(? (?: ([^ \ /] +?)) | Medien | Filme) \/(?: ([^ \ /] +?)) \ /? $'. Die erste Nicht-Capture-Gruppe fehlt ':' nach dem Fragezeichen '(?: ...)' Wenn es sich um eine Capture-Gruppe handelt, entfernen Sie das Fragezeichen '?' Als '(...)' – ctwheels

Antwort

1

ein Dummy-param Verwendung sollte funktionieren:

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

Das Verfahren verwendet eine RegExp von einer Route Pfad zu erzeugen, ist ein wenig unberechenbar.

2

ich nur ein Array für Ihre Routen verwenden würde:

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

Edit: Wenn

Sie wollen Regex verwenden, das funktioniert auch:

+0

Vielen Dank. Ich denke, ich werde die Antwort von Rockle benutzen, da es Wiederholungen vermeidet und ich es für komplexe Routen klarer finde. +1 – David