2014-12-04 75 views
1

在我的Node.js/Express應用程序中,我想加載一些路線以異步表示。準確地說,我想從MongoDB中檢索促銷代碼,並根據這些代碼創建動態路由。異步添加快遞路線

我現在有這樣的代碼:

var promotion = require('../models/promotion'); 

promotion.list(function(promotions) { 
    // Loop all promotions 
    _.each(promotions, function(promo) { 
     app.route(promo.get('path')).get(promotion.claim); 
    }); 
}); 

可惜,這是行不通的。經過一些調試後,我發現路由實際上被添加到路由列表中,但是因爲它們是異步加載的,所以它們被添加到最後添加的'catch all'路由之後。我發現通過檢查:

console.log( app._router.stack ); 

我讀過一些解決方案,包括所有在該功能附加包羅萬象的規則和處理路由路徑,但說實話這聽起來並不太大。我想繼續使用app.route()爲我的其他路線。

回答

2

捕捉所有規則仍然是處理它的最佳方式。你仍然可以使用app.route()作爲你的其他路線。下面是可用於app.js的示例:

function r1(req,res) { res.status(202).end(); } //todo action logic 
function r2(req,res) { res.status(202).end(); } //todo action logic 
app.set("dynamic.routes", {"/r1":r1, "/r2":r2}); 

//this is dynamic routing function 
function handleDynamicRoutes(req,res,next) {  
    var path = req.path; 
    var routes = app.get("dynamic.routes"); 
    if (routes[path]) { 
     routes[path](req,res); 
    } else { 
     next(); 
    } 
} 

app.all('*', handleDynamicRoutes); 
app.use('/users', require('./routes/users')); //just an example 
app.use('/documents', require('./routes/doucments')); //ditto 

顯然,您可以隨時更改dynamic.routes。 您可以根據需要靈活地使用它,包括使用快速路線。

+0

感謝您的回答!經過一番更多的搜索,恐怕你是對的:)。我擔心這種全面的路線可能會對性能造成不利影響,因爲我讀到了這個:http://stackoverflow.com/questions/15344628/best-way-to-do-dynamic-routing-with-express-js -node-JS。但是在我重新閱讀之後,我意識到這個例子中,anwswer對性能不利,因爲每次調用都會檢查數據庫。 – 2014-12-05 07:30:20