2014-12-30 87 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

同樣