2016-02-05 92 views
0

我想在我的应用程序中使用默认控制器和默认操作,以便如果用户进入root用户,他将被提供相应的页面。 对于我做了一个中间件在nodejs中重写url

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.jsmiddlewares.jsapp.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循环)。无论如何,我建议您不要在for循环内定义function

+0

当我为目录硬编码一个路由时,即使在重写之后它仍然执行正常。但是当我尝试重写URL时,在for循环中创建的路由不起作用。然而,他们的工作,如果我直接输入正确的url,如localhost:3000 /目录/索引工作正常,但不适用于本地主机:3000 –