express.js - gestionnaire de routage unique pour plusieurs itinéraires sur une seule ligne

109

Existe-t-il un moyen de faire cela sur un seul appel de fonction?

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

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

Quelque chose comme:

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

Je sais que c'est un gâchis de syntaxe, mais juste pour donner une idée de ce que je voudrais réaliser, un éventail de routes serait génial!

Quelqu'un sait-il comment faire ça?

Aronis Mariano
la source
2
Vous devriez être capable d'écrire une expression régulière qui correspondra à toutes les routes que vous souhaitez acheminer vers todo et utiliser l'expression régulière comme point de terminaison. Cela peut finir par paraître désordonné, mais cela fonctionnera. Je ne poste pas cela comme une réponse car je ne suis pas sûr de ce que serait l'expression régulière, et c'est plus une poussée dans cette direction. Il est fait mention de l'utilisation d'expressions régulières dans la documentation ici: expressjs.com/api.html#app.VERB
Nick Mitchinson
Je n'ai pas d'expérience avec les regex dans JS ... je vais essayer ... mais toute autre option est la bienvenue!
Aronis Mariano
1
Je n'ai pas grand-chose non plus, ce qui est honnêtement pourquoi je ne vous l'ai pas donné, mais je crois comprendre que les expressions régulières sont assez universelles; Express devrait analyser vos expressions de la même manière que n'importe quel autre langage.
Nick Mitchinson
1
Les expressions régulières sont très puissantes et valent vraiment la peine d'être apprises. Voici une solution: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- type ',' text / plain ') .send ("Matched:'" + matched + "'");}); Un couple de choses: 1. Les expressions régulières commencent et se terminent par un /, donc tout / char doit être échappé. 2. Le ^ char correspond au début de la chaîne, le $ char correspond à la fin de la chaîne. Sans eux, le match réussira même avec des caractères superflus au début ou à la fin du chemin, c'est-à-dire / x / blablaxxx
John Deighan

Réponses:

132

Je suis tombé sur cette question en cherchant la même fonctionnalité.

@Jonathan Ong a mentionné dans un commentaire ci-dessus que l'utilisation de tableaux pour les chemins est obsolète, mais elle est explicitement décrite dans Express 4 et fonctionne dans Express 3.x. Voici un exemple de quelque chose à essayer:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

De l'intérieur de l' requestobjet, avec un chemin de /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"
}, 

Notez ce qui se passe avec les paramètres: il est conscient des groupes de capture et des paramètres dans tous les chemins possibles, qu'ils soient ou non utilisés dans la requête en cours.

Ainsi, empiler plusieurs chemins via un tableau peut être fait facilement, mais les effets secondaires sont peut-être imprévisibles si vous espérez récupérer quelque chose d'utile dans le chemin utilisé par le biais de paramètres ou de groupes de capture. C'est probablement plus utile pour la redondance / aliasing, auquel cas cela fonctionnera très bien.

Edit: Veuillez également voir la réponse de @ c24w ci-dessous .

Edit 2: C'est une réponse modérément populaire. Veuillez garder à l'esprit qu'ExpressJS, comme la plupart des bibliothèques Node.js, est un festin déplaçable. Bien que le routage ci-dessus fonctionne toujours (je l'utilise pour le moment, une fonctionnalité très pratique), je ne peux pas garantir la sortie de l'objet de requête (c'est certainement différent de ce que j'ai décrit). Veuillez tester attentivement pour vous assurer d'obtenir les résultats souhaités.

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

:vardéfinit le req.paramque vous n'utilisez pas. il n'est utilisé que dans ce cas pour définir l'expression régulière.

(bla|blabla)définit l'expression régulière pour qu'elle corresponde, donc elle correspond aux chaînes blaet blablah.

?rend l'ensemble de l'expression régulière facultative, donc il correspond /également.

Jonathan Ong
la source
1
/bla(bla)?fonctionne également, mais tous les paramètres après ne se remplissent pas correctement (c'est /bla(bla)?/:value-à- dire ne se remplissent pas req.params.value). Quelqu'un sait pourquoi?
joscarsson
Si vous utilisez express, vous pouvez l'obtenir avec req.params.varmais vous devez vous assurer que vous avez reqpassé à la fonction
Matt The Ninja
51

Vous pouvez en fait passer un tableau de chemins , comme vous l'avez mentionné, et cela fonctionne très bien:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Alex
la source
28
Quel est le remplacement de cette obsolète?
brandonscript
5
@JonathanOng Vous dites que c'est obsolète, et remus demande quel est le remplacement. Pouvez-vous s'il vous plaît répondre à sa question?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) fonctionne très bien dans express 4 aucun avertissement d'
obsolescence
2
@JonathanOng regardant la documentation actuelle d'Express v4 à l'aide d'un tableau ne semble pas être obsolète.
Jason Axelson
32

Juste pour élaborer sur la réponse de Kevin , ceci est tiré de la documentation 4.x :

Le chemin pour lequel la fonction middleware est appelée; peut être l'un des:

  • Une chaîne représentant un chemin.
  • Un modèle de chemin.
  • Un modèle d'expression régulière pour faire correspondre les chemins.
  • Un tableau de combinaisons de l'un des éléments ci-dessus.

Ils ont quelques exemples , notamment:

Cela correspondra à des chemins commençant par /abcd, /xyza, /lmnet /pqr:

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

Je suis allé pour un:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
la source
-2

exiger le fichier de votre itinéraire d'origine et définir le nouvel itinéraire comme ceci

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
la source