2014-12-30 33 views
0

我正在使用Express和Node构建Web应用程序,并试图将我的路由因素考虑在内,以便在同一文件中没有数百个路由。本网站提供的projects目录中的不同文件,所以我做的routes/一个名为projectRoutes.js处理路由项目文件:如何使用Node.js Express模块​​化路由

var express = require('express'); 

module.exports = function() { 

    var functions = {} 

    functions.routeProject = function(req, res) { 
     res.render('pages/projects/' + req.params.string, function(err, html) { 
      if (err) { 
       res.send("Sorry! Page not found!"); 
      } else { 
       res.send(html); 
      } 
     }); 
    }; 

    return functions; 
} 

然后,在我的routes.js,我有这个...

var projectRoutes = require("./projectRoutes"); 
router.get('/projects/:string', function(req, res) { 
    projectRoutes().routeProject(req, res); 
}); 

projectRoutes.js中有没有更好的方法来构造这个功能?换句话说,我怎么可以配置projectRoutes.js让我可以写的代码的后续行index.js

router.get('/projects/:string', projectRoutes.routeProject); 

上面似乎是正常的方式来处理这样的事情,但目前上述行抛出一个错误在Node中表示函数未定义。

感谢您的帮助!

回答

4

你应该使用本地express router,它是为了解决这个确切的问题!它基本上允许您以模块化的方式创建简化的嵌套路线。

对于您的每个资源,您都应该将路由划分为名为<yourResource>.js的几个模块。这些模块将包含所有路由代码以及任何其他配置或必要的功能。然后,你会重视他们在index.js:

var apiRoute = router.route('/api') 
apiRoute.use('/<yourResource>', yourResourceRouter) 

举例来说,如果你有一个资源bikes

index.js

var apiRoute = router.route('/api') 
    , bikeRoutes = require('./bikes') 

apiRoute.use('/bikes', bikeRoutes) 

然后在bike.js

var express = require('express') 
    , router = express.Router() 
    , bikeRoutes = router.route('/') 

bikeRoutes.get(function (req, res) { 
    res.send('api GET request received') 
}); 

module.exports = bikeRoutes 

从那里很容易看出你可以埠使用许多不同的资源并不断嵌套它们。

例如在index.js连接的路由将是的较大:

var apiRoute = router.route('/api') 
    , bikeRoutes = require('./bikes') 
    , carRoutes = require('./cars') 
    , skateboardRoutes = require('./skateboards') 
    , rollerskateRoutes = require('./rollerskates') 

// routes 
apiRoute.use('/bikes', bikeRoutes) 
apiRoute.use('/cars', carRoutes) 
apiRoute.use('/skateboards', skateboardRoutes) 
apiRoute.use('/rollerskates', rollerskateRoutes) 

每个路由器将包含类似于bikes.js代码。通过这个例子,使用express的路由器模块化很容易看到,并使您的代码库更易于管理。

2

另一种选择是使用Router对象本身,而不是Route对象。 在Index.js:

//Load Routes  
BikeRoutes = require('./routes/Bike.js'); 
CarRoutes = require('./routes/Car.js'); 

//Routers 
var express = require('express'); 
var ApiRouter = express.Router(); 
var BikeRouter = express.Router(); 
var CarRouter = express.Router(); 

//Express App 
var app = express(); 

//App Routes 
ApiRouter.get('/Api', function(req, res){...}); 
ApiRouter.use('/', BikeRouter); 
ApiRouter.use('/', CarRouter); 

在Bike.js:

var express = require('express'); 
var router = express.Router(); 

router.get('/Bikes', function(req, res){...}); 
module.exports = router; 
在Car.js

同样