Comment configurer des routes dynamiques avec express.js
J'ai un itinéraire.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);
});
};
Considérant que j'ai plus de 200 routes différentes à créer, je me retrouverais avec des choses comme 'article1',' article2 ' etc
Et mon application.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 ceci?
5 réponses
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 que vous pourriez faire quelque chose comme:
var articlesEndpoints = ['/article2', '/article3'];
articlesEndpoints.forEach(function(name) {
app.get(name, function(req, res) {
res.render(name);
});
});
C'est ce que tu voulais dire?
Ça a finalement marché..
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 à plusieurs 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 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 plusieurs façons d'implémenter des routes express dynamiques. Cela dépend en grande partie de la structure que vous avez implémentée dans votre projet, ici je laisse un exemple de routes dynamiques et j'espère que ce 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 va créer le code du routeur automatiquement.
, Nous pouvons simplement ajouter un jadewalker
commentaire à votre jade
Ou pug
fichier.
//- 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
. (^∀^)