2016-02-05 1 views
0

Я хочу иметь контроллер по умолчанию и действие по умолчанию в своем приложении, так что если пользователь придет к корню, ему будет показана соответствующая страница. Для этого я сделал промежуточное программное обеспечениеRewrite url in nodejs

module.exports = function (controller, action) { 
    return function (req, res, next) { 
    // remove any trailing slashes 
    req.originalUrl = req.originalUrl.replace(/\/$/, ""); 
    // provide default controller 
    if (!req.params.controller) { 
     req.originalUrl = '/' + controller; 
    } 
    // provide default action 
    if (!req.params.action) { 
     req.originalUrl = req.originalUrl + '/' + action; 
    } 
    console.log(req.originalUrl); // gives me expected result 
    next(); 
    } 
} 

это мое приложение код:

var router=require(./router()) 
app.use('/:controller?/:action?',urlMaker(config.defaultController,config.defaultAction)); 
app.use('/',router); 

Это маршрутизатор код:

var express = require('express'); 
var globals = require('../globals'); 

function getRouter() { 
    var router = express.Router(); 
    var controllerList = globals.getController(); 
    console.log("Creating routes for available controllers"); 

    for (var name in controllerList) { 
    //start creating routes for available controllers 
    router.get('/' + name + '/:action', function (req, res, next) { 
     console.log("router reached"); 
     var action = req.params.action; 
     controllerList[name][action](req, res); 
    }); 
    console.log("Created route for " + name); 
    } 

    router.get('/test', function() { 
    console.log("hello"); 
    }); 

    return router; 
} 

module.exports = getRouter; 

Что я делаю неправильно. Проблема в том, что маршрутизатор не получает имени действия. Как это сделать ?

ответ

0

Эта простая схема хорошо работает определение router.js, middlewares.js и app.js:

middlewares.js

function getMiddleware(v1, v2) { 
    return function (req, res, next) { 
    // whatever, you can use v1 and v2 as you wish 
    next(); 
    } 
} 

module.exports = getMiddleware; 

router.js

var express = require('express'); 

function getRouter(v3) { 
    var router = express.Router(); 
    router.get('/', function (req, res) { 
    // whatever, here you have v if you wish 
    res.send('Hello ' + v); 
    }); 
    return router; 
} 

module.exports = getRouter; 

app.js

var middleware = require('./middlewares'); 
var router = require('./router'); 
var express = require('express'); 

// ---- 
var v1 = v2 = v3 = 42; 
// ----- 
var app = express(); 

app.use(middleware(v1, v2)); 
app.use('/', router(v3)); 
app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

После того, что простое приложение работает, я бы пойти на «Определение автоматического маршрутизатора» (далее for цикла). Во всяком случае, я предлагаю не определять function внутри вашего цикла for.

+0

Когда я жестко программирую маршрут для Каталога, он выполняется отлично даже после перезаписи. Но маршруты, созданные в цикле for, не работают, когда я пытаюсь переписать URL. Однако они работают, если я непосредственно ввожу правильный URL-адрес, например localhost: 3000/Catalog/index работает нормально, но не работает для localhost: 3000 –

 Смежные вопросы

  • Нет связанных вопросов^_^