如何用express.jsconfigurationdynamic路由

我有一个route.js,看起来像这样:

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); }); }; 

考虑到我有200多条不同的路线可以创作,我最终会得到“文章1”,“文章2”等内容

和我的app.js是这样的:

 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); 

有没有什么dynamic的方式来创build这个?

我会为/modules/:name做同样的事情

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

从rest的angular度来看,这将更有意义。

如果由于某种原因你不能这样做,你可能想要做一些事情:

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

这是你的意思吗?

终于搞定了..

在我得到的情况下,第1条,第2条等:

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

在我得到多级url的情况下,我创build了一个自定义函数:

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

以下是其他一些解决scheme:

 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(); }); 

或者将app.all用于第一个解决scheme或使用通用中间件:

 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(); }); 

实现dynamic快速路由有很多种方法。 这在很大程度上取决于你在项目中实现的结构,在这里我留下了一个dynamic路线的例子,我希望这将是有用的。

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')()); 

我创build了一个名为“ 玉器行者”的新模块。 它会自动创build路由器代码。

我们可以简单地给你的jadepug文件添加一个“ jadewalker评论。

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

并将此模块添加到我们的app 。 就这样。

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

我们可以通过URL http://localhost:3000/b/abc来访问我们的jade文件。 (^∀^)