Comment configurer des itinéraires dynamiques avec express.js

J'ai une route.js qui ressemble à ceci:

module.exports = function(app) { app.get('/tip', function(req, res) { res.render("tip"); }); app.get('/article', function(req, res) { res.render("article"); }); app.get('/article1', function(req, res) { res.render("article1"); }); app.get('/article2', function(req, res) { res.render("article2"); }); app.get('/article3', function(req, res) { res.render("article3"); }); app.get('/modules/:name', function(req, res) { var name = req.params.name; res.render('modules/' + name); }); app.get('/modules/esaver/:name', function(req, res) { var name = req.params.name; res.render('modules/esaver/' + name); }); }; 

Étant donné que j'ai plus de 200 voies différentes à créer, je finirais par des articles comme 'article1', 'article2', etc.

Et mon app.js est comme:

 var express = require('express') ,http = require('http') ,fs = require('fs') ,path = require('path'); var app = express(); html_templates = __dirname + '/html_templates'; app.set('views', html_templates + '/views'); app.set('view engine', 'jade'); app.use('/Core', express.static(__dirname + '/Core')); app.listen(3000, function () { console.log("express has started on port 3000"); }); require('./html_templates/controller/routes.js')(app); 

Existe-t-il un moyen dynamique de créer cela?

Je ferais la même chose que vous avez fait pour /modules/:name

 app.get('/article/:id', function(req , res){ res.render('article' + req.params.id); }); 

Ce serait plus significatif du point de vue du repos.

Si vous ne pouvez pas le faire pour une raison particulière, vous voudrez peut-être faire quelque chose comme:

 var articlesEndpoints = ['/article2', '/article3']; articlesEndpoints.forEach(function(name) { app.get(name, function(req, res) { res.render(name); }); }); 

Est-ce que c'est ce que vous vouliez dire?

Finalement, ça fonctionnait …

Dans les cas où j'ai eu, article1, article2, etc.:

 app.get('/:name(article|article2|article3)?', function(req, res) { var name = req.params.name; res.render(name); }); 

Dans les cas où j'ai eu une URL multi-niveaux, j'ai créé une fonction personnalisée:

 function geturl(url) { app.get('/' + url + '/' + ':name', function(req, res){ var name = req.params.name; res.render(url + '/' + name); }); }; 

Voici quelques autres solutions:

 app.get(^\/article(\d{1,3})?\/?$, function(req, res, next) { var n; if (req.params[0]) n = parseInt(req.params[0], 10); if (!n || (n > 0 && n < 900)) res.render('article' + (n ? n : '')); else next(); }); 

Ou utilisez l' app.all pour la première solution ou utilisez un middleware générique:

 app.use(function(req, res, next) { var m = ^\/article(\d{1,3})?\/?$.exec(req.url); if (m) { var n; if (m[0]) n = parseInt(m[0], 10); if (!n || (n > 0 && n < 900)) return res.render('article' + (n ? n : '')); } next(); }); 

Il existe de nombreuses façons de mettre en place des itinéraires express dynamiques. Cela dépend dans une large mesure de la structure que vous avez implémentée dans votre projet, je laisse ici un exemple de routes dynamiques et j'espère que cela sera utile.

RouterService.js

 module.exports = (function(myCustomRoutes) { let express = require('express'); let router = express.Router(); let methods = Object.keys(myCustomRoutes); // getting methods ('get', 'post'... etc) let routesMethod = null; let url = null; for(i in methods) { routesMethod = Object.keys(myCustomRoutes[methods[i]]); for(j in routesMethod) { url = '/' + routesMethod[j]; url += '/:' + myCustomRoutes[methods[i]][routesMethod[j]].params.join('/:');console.log(url); router[methods[i]](url, myCustomRoutes[methods[i]][routesMethod[j]].controller); } } return router; })(); 

CustomRoutes.js

 module.exports = (function() { let routes = {get: {}, post: {}}; let routerService = require('./RouterService'); // GET: /dynamic1 routes.get.dynamic1 = { params: [], controller: function(req, res, next) { res.send('route 1'); } }; // GET: /dynamic2/:param1 routes.get.dynamic2 = { params: [':param1'], controller: function(req, res, next) { res.send('route 2'); } }; // POST: /dynamic3/:param1/:param1 routes.post.dynamic3 = { params: ['param1', 'param2'], controller: function(req, res, next) { res.send('route 3'); } }; /* * Export a router with paths * GET: /dynamic1 * GET: /dynamic2/:param1 * POST: /dynamic3/:param1/:param1 **/ return routerService(routes); })(); 

App.js

 let express = require('express'); let app = express(); /* * Option 1 * GET: /dynamic1 * GET: /dynamic2/:param1 * POST: /dynamic3/:param1/:param1 **/ app.use(require('CustomRoutes')()); /* * Option 2 * GET: /api/v1/dynamic1 * GET: /api/v1/dynamic2/:param1 * POST: /api/v1/dynamic3/:param1/:param1 **/ app.use('/api/v1', require('CustomRoutes')()); 

Je crée un nouveau module appelé: jadewalker . Il créera automatiquement un code de routeur.

Nous pouvons simplement ajouter un commentaire jadewalker à votre fichier jade Or pug .

 //- jadewalker=/b,/b/:id doctype html html title b.jade body p b.jade p params: #{params.id} 

Et ajoutez ce module à notre app . C'est tout.

 var app = require('koa')() var router = require('koa-router')(); router = require('jadewalker')(router, path.join(__dirname, 'views')); app.use(router.routes()); 

Nous pouvons visiter notre fichier jade par l'URL http://localhost:3000/b/abc . (^ ∀ ^)