【问题标题】:How to modularize routing with Node.js Express如何使用 Node.js Express 模块化路由
【发布时间】:2015-02-27 01:12:05
【问题描述】:

我正在使用 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 中抛出一个错误,指出函数未定义。

感谢您的帮助!

【问题讨论】:

    标签: node.js express routing


    【解决方案1】:

    你应该使用原生的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 的路由器模块化并使您的代码库更易于管理。

    【讨论】:

    • 例如,您是否进一步分离了bikeRoutes?
    【解决方案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 中类似

    【讨论】:

    • 不应该是ApiRouter.use('/', BikeRoutes);ApiRouter.use('/', CarRoutes);吗?这样您就可以在.use 中包含所需的模块?因为目前BikeRouterCarRouter 根本没有被使用,而BikeRouter = express.Router();CarRouter = express.Router(); 被冗余声明。还是我理解错了?
    猜你喜欢
    • 2011-06-30
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多