web-dev-qa-db-fra.com

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

Y at-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 pour vous donner une idée de ce que je voudrais réaliser, un tableau des routes serait génial! 

Quelqu'un sait-il comment faire ça?

80
Aronis Mariano

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 qu'elle est explicitement décrite dans Express 4 et qu'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 ) {

    }
);

Depuis l'intérieur de l'objet 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 est conscient des groupes de capture et des paramètres de tous les chemins possibles, qu'ils soient utilisés ou non dans la requête en cours.

Il est donc facile d'empiler plusieurs chemins via un tableau, mais les effets secondaires sont peut-être imprévisibles si vous espérez trouver quelque chose d'utile dans le chemin qui a été utilisé sous forme de paramètres ou de groupes de capture. C'est probablement plus utile pour la redondance/aliasing, auquel cas ça fonctionnera très bien.

Edit: Voir aussi la réponse de @ c24w ci-dessous .

Edit 2: Ceci est une réponse modérément populaire. N'oubliez pas que ExpressJS, comme la plupart des bibliothèques Node.js, est un festin mobile. 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 (il est certainement différent de ce que j'ai décrit). Veuillez tester avec soin pour vous assurer d'obtenir les résultats souhaités.

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

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

(bla|blabla) définit la regex afin qu'elle corresponde, donc elle correspond aux chaînes bla et blablah.

? rend l'intégralité de la regex facultative, de sorte qu'elle correspond également à /.

51
Jonathan Ong

Vous pouvez réellement passer dans un tableau de chemins , comme vous l'avez dit, et cela fonctionne très bien:

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

Juste pour élaborer sur la réponse de Kevin , cela provient des documents 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 ces choix.

Ils ont quelques exemples , y compris:

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

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

Je suis allé pour un:

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

demander 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'));
0
Roman Mahrer