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

use*_*174 3 routing node.js express

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

有没有更好的方法来内部构造此功能projectRoutes.js?换句话说,我projectRoutes.js该如何配置以便可以在以下代码中编写以下代码index.js

router.get('/projects/:string', projectRoutes.routeProject);
Run Code Online (Sandbox Code Playgroud)

上面的内容似乎是处理类似问题的正常方法,但是当前,上面的代码行在Node中引发错误,表明该函数未定义。

谢谢你的帮助!

agc*_*nti 5

您应该使用本机快速路由器,它是为解决此确切问题而设计的!从本质上讲,它允许您以模块化方式创建简化的嵌套路由。

对于您的每种资源,您都应该将您的路线分成几个名为的模块<yourResource>.js。这些模块将包含所有路由代码以及任何其他配置或必要的功能。然后,您可以使用以下命令将它们附加到index.js中:

var apiRoute = router.route('/api')
apiRoute.use('/< yourResource >', yourResourceRouter)
Run Code Online (Sandbox Code Playgroud)

例如,如果您有资源bikes

index.js

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

apiRoute.use('/bikes', bikeRoutes)
Run Code Online (Sandbox Code Playgroud)

然后在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
Run Code Online (Sandbox Code Playgroud)

从那里很容易看出,您可以构建许多不同的资源并不断嵌套它们。

在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)
Run Code Online (Sandbox Code Playgroud)

每个路由器将包含类似于的代码bikes.js。通过此示例,可以很容易地使用express的路由器将其模块化,并使您的代码库更易于管理。