如何用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路由器代码。
我们可以简单地给你的jade
或pug
文件添加一个“ 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文件。 (^∀^)
- Angular问题和“否”Access-Control-Allow-Origin'标题“ – 使用OAuth 2,Passport,Express和Node
- 如何设置快递websocket服务器的路由?
- 如何使用GridFS来存储使用Node.js和Mongoose的图像
- 如何使用ExpressJS / RailwayJS(Node.JS)生成JSON
- 如何使用promise在express.js中正确处理错误(string或对象)
- 在node.js中添加逻辑/validation到multer(快速)
- 如何使用express从不同的中间件中获取响应对象的数据
- 快递:是否有可能简化res.sendFile中的path?
- 使用Express中的参数在URL上提供静态文件