如何使用Node.js Express模块​​化路由

时间:2014-12-30 21:23:32

标签: node.js express routing

我正在使用Express和Node构建一个Web应用程序,并且我正在尝试考虑我的路由,以便我在同一个文件中没有数百条路由。该站点提供projects目录中的不同文件,因此我在routes/中创建了一个名为projectRoutes.js的文件来处理项目文件的路由:

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中抛出一个错误,表示该函数未定义。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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的路由器模块化很容易看到,并使您的代码库更易于管理。

答案 1 :(得分:4)

另一种选择是使用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