我有很多路线,如:
app.all('/:controller', controller.init());
app.all('/:controller/:action', controller.init());
app.all('/:controller/:action/:par1', controller.init());
app.all('/:controller/:action/:par1/:par2', controller.init());
app.all('/:controller/:action/:par1/:par2/:par3', controller.init());
我可以一次优化这些路线吗?
答案 0 :(得分:6)
不,你不能。这不是你应该如何做路由。路线应该很好地定义为有明智的uris。
例如我手写了以下路线
app.get(“/ blog”,controller.index);
app.get("/blog/new", controller.renderCreate);
app.get("/blog/:postId/edit", controller.renderEdit);
app.get("/blog/:postId/:title?", controller.view);
app.post("/blog", controller.createPost);
app.put("/blog/:postId", controller.updatePost);
app.del("/blog/:postId", controller.deletePost);
这意味着您可以完全控制所需的URI。
强烈建议您手动定义您想要的uris并将它们连接到您想要的任何控制器对象。
这意味着你的uris保持漂亮,语义和完全控制。
答案 1 :(得分:1)
目前我正在尝试通过执行以下操作来获取类似ASP.NET MVC路由的路由:
app.all('*', function(req, res) {
//extract the route into an array
var m_path = req.route.params.toString().split('/');
//require for a module with a dynamic name based on path info
var controller = require('./controllers/' + m_path[1] + '.js');
//build a method name
var fname = req.route.method + (m_path[2] || 'Index');
//if a exported method exists on the module, then use it, otherwise, create a new function
var func = controller[fname] || function (){
//maybe use a 404
res.send('controller/method not found: ' + fname);
};
//invoke the function
func.call(this, req, res);
});
在这个例子中,我有一个名为controllers的文件夹。然后我将所有控制器放在该文件夹中。然后我可以这样做:
路线:/ users /
js:controllers / users.js
//template: GET /users/
module.exports.getIndex = function(req, res) {
res.send('get on index');
};
//template: POST /users/index
module.exports.postIndex = function(req, res) {
res.send('post on index');
};
//template: PUT /users/index
module.exports.putIndex = function(req, res) {
res.send('put on index');
};
//template: GET /users/custom
module.exports.getCustom = function(req, res) {
res.send('get on custom');
};
答案 2 :(得分:0)
我稍微修改了Jone Polvera的答案以使用正则表达式:
app.all(/^(.+)\/(.+)/, function(req, res) {
var controller = require('./routes/' + req.params[0] + '.js');
var fname = req.params[1];
var func = controller[fname] || function () {
res.send('controller/method not found: ' + fname);
};
func.call(this, req, res);
});
我有一个名为routes的文件夹。然后在路线中我有一个名为admin.js的文件:
exports.posts = function(req, res) {
...
}
所以URL / admin / posts会在那里路由。