Comment autoriser les barres obliques dans mes itinéraires Express?

Je tente d’implémenter des permaliens, sous la forme /2013/02/16/title-with-hyphens . J’aimerais utiliser les parameters de route. Si j’essaye l’itinéraire suivant:

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

… alors j’obtiens un 404, probablement parce qu’Express ne recherche qu’un paramètre et pense qu’il y en a 4.

Je peux le contourner avec /:y/:m/:d/:t , mais cela force mes permaliens à être de cette forme de façon permanente.

Comment obtenir des parameters de route pour inclure des barres obliques?

Utilisez une expression régulière au lieu d’une chaîne.

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

Notez que vous ne pouvez pas utiliser la syntaxe de chaîne ( app.get('/:href(.+)') ) Car Express n’autorise qu’un petit sous-ensemble d’expressions régulières dans les chaînes de routage et utilise ces expressions comme vérification conditionnelle composante particulière de la route. Il ne capture pas le contenu correspondant dans le conditionnel, ni ne permet de faire correspondre des composants (parties de l’URL séparées par des barres obliques).

Par exemple:

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

Cette route ne correspond que si le premier composant ( compa ) est un seul chiffre et que le second composant ( compb ) est une seule lettre az.

'/:href(.+)' dit “ne fait correspondre le premier composant que si le contenu est quelconque”, ce qui n’a pas beaucoup de sens; c’est le comportement par défaut de toute façon. De plus, si vous examinez la source , vous constaterez qu’Express force réellement le sharepoint cette condition à être littéral.

Par exemple, app.get('/:href(.+)') dans:

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

Notez que votre . a été échappé, cette route ne correspond donc qu’à une ou plusieurs périodes.

Il semble que app.get("/:href(*)", ...) fonctionne bien (du moins dans Express 4). Vous obtiendrez votre valeur de paramètre dans req.params.href .

Il sera également déclenché par / route, ce qui n’est probablement pas ce que vous voulez. Vous pouvez l’éviter en définissant app.get('/', ...) ailleurs dans votre application ou en recherchant explicitement une chaîne vide.

Vous pouvez le faire avec le routage regex

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

Je ne sais pas si la regex est juste, mais vous avez l’idée

MODIFIER:

Je ne pense pas que ce qui précède fonctionne, mais cela ne

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

Allez à http://localhost:3000/2012/08/05/hello-i-must-be 3000/2012/08/05 http://localhost:3000/2012/08/05/hello-i-must-be ça req.params = [ '2012', '08', '05', 'hello-i-must-be' ]