141 votes

express.js - gestionnaire de routage unique pour plusieurs routes en une seule ligne

Existe-t-il un moyen de faire cela en 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 fouillis syntaxique, mais pour donner une idée de ce que je voudrais obtenir, un tableau des routes serait génial !

Quelqu'un sait comment faire ?

165voto

Kevin Teljeur Points 71

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 dépréciée, mais elle est explicitement décrite dans Express 4, et elle 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 la request avec un chemin d'accès 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 connaît les groupes de capture et les 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 du chemin qui a été utilisé par le biais de paramètres ou de groupes de capture. C'est probablement plus utile pour la redondance/alias, auquel cas cela fonctionnera très bien.

Edit : Veuillez également consulter la réponse de @c24w en dessous de .

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 une fête mobile. Bien que le routage ci-dessus fonctionne toujours (je l'utilise en ce moment, c'est une fonctionnalité très pratique), je ne peux pas me porter garant de la sortie de l'objet de requête (c'est certainement différent de ce que j'ai décrit). Veuillez tester soigneusement pour vous assurer que vous obtenez les résultats souhaités.

68voto

Jonathan Ong Points 5464
app.get('/:var(bla|blabla)?', todo)

:var définit le req.param que vous n'utilisez pas. Il est seulement utilisé dans ce cas pour définir la regex.

(bla|blabla) définit la regex pour qu'elle corresponde aux chaînes de caractères suivantes bla y blablah .

? rend l'ensemble de l'expression facultative, de sorte qu'elle correspond à / également.

62voto

alex Points 184

Vous pouvez en fait passer dans un tableau de chemins comme vous l'avez mentionné, et ça marche très bien :

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

44voto

c24w Points 1254

Juste pour élaborer sur La réponse de Kevin c'est à partir de la Docs 4.x :

Le chemin pour lequel la fonction de l'intergiciel est invoquée ; peut être l'un des éléments suivants :

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

Ils ont quelques exemples y compris :

Cela correspondra aux chemins commençant par /abcd , /xyza , /lmn y /pqr :

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

19voto

Augustin Riedinger Points 1600

Je suis allé chercher un :

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X