J'ai un 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);
});
};
Considérant que j’ai plus de 200 itinéraires différents à créer, je finirais avec des choses 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?
Enfin, ça marche ..
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);
});
};
Je referais 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?
Il existe de nombreuses façons d'implémenter des itinéraires express dynamiques. Cela dépend en grande partie de la structure que vous avez mise en place dans votre projet, je laisse ici un exemple de routes dynamiques et j'espère que cela vous 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')());
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();
});
Voici ce que j'ai fait pour créer des API dynamiques tout en contrôlant quelle API permet d'accéder à quelles méthodes. Pour maintenir les API à partir de maintenant, vous pouvez simplement éditer le tableau API.
const APIs = [
{
route: 'order',
methods: ['get', 'post']
},
{
route: 'item',
methods: ['get']
},
]
APIs.forEach(api => {
api.methods.forEach(method => {
app[method]('/' + api.route, (req, res) => require('./routes/' + api.route)[method](req, res))
})
})
Je crée un nouveau module appelé: jadewalker . Cela créera le code de routeur automatiquement.
Nous pouvons simplement ajouter un commentaire jadewalker
à votre fichier jade
ou 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 à l’URL http://localhost:3000/b/abc
. ^ ∀ ^)