Как я могу оптимизировать маршруты в Express.JS? - PullRequest
4 голосов
/ 03 декабря 2011

У меня много маршрутов, таких как:

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

Могу ли я оптимизировать эти маршруты в одном?

Ответы [ 3 ]

6 голосов
/ 03 декабря 2011

Нет, ты не можешь. Это не так, как вы должны делать маршрутизацию. Маршруты должны быть четко определены, чтобы иметь разумный 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 голос
/ 25 февраля 2013

В настоящее время я пытаюсь получить маршруты, такие как маршруты 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.Затем я поместил все контроллеры в эту папку.Тогда я могу сделать что-то вроде этого:

route: / 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');
};
0 голосов
/ 15 июня 2014

Я слегка изменил ответ Джона Полвера, чтобы использовать регулярное выражение:

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

У меня есть папка с названием маршрутов. Затем в маршрутах у меня есть файл с именем admin.js:

exports.posts = function(req, res) {
...
}

Таким образом, URL / admin / posts направляется туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...