2014-08-27 70 views
5

我想創建快遞自動路由,目前我可以讀目錄,並從所有可用的文件手動添加路徑,添加的路由也可以,如果有變化的路由文件如果應用程序已在監聽,如何添加快速路線?

delete require.cache[require.resolve(scriptpath)]; 
var routescript = {}; 
try { 
    routescript = require(scriptpath); 
} catch (e){ 
    console.log('Express >> Ignoring error route: ' + route + ' ~ >' + scriptpath); 
} 
var stack_index = app._router.stack_map[route] 
var stack = app._router.stack[stack_index]; 
if (stack) { 
    app._router.stack[stack_index].handle = routescript; 
    console.log('Replace Route Stack \'' + route + '\''); 
} else { 
    app.use(route, routescript); 
    var stack_index = app._router.stack_map[route] = (app._router.stack.length-1); 
    console.log('Add Route Stack \'' + route + '\''); 
} 

但那些只是工作更新只在應用程序偵聽端口之前,

如何在應用程序偵聽端口後添加/刪除新的路由堆棧?我能想到的

一種方法是關閉服務器配置/添加/刪除重新聽的路線,但我想這是一個不好的做法,

+0

youu增加什麼樣的路線? – Vinz243 2014-08-27 10:05:36

+0

它可以獲取,發佈,放置或刪除 – DeckyFx 2014-08-27 10:12:06

+0

以及哪個版本的快遞? – Vinz243 2014-08-27 10:12:21

回答

1

我這麼笨....

Express 4的默認能夠將它添加監聽

那麼,爲什麼我不能做之前甚至之後的路線?因爲在路由器層堆棧之上,我添加了錯誤處理層堆棧,所以我之後添加的任何路由器層,都不會被請求到達,因爲當請求被處理時,它將首先被錯誤處理器層捕獲。

所以正確的方法是,如下所示:

  1. 我要管理什麼指數是位於app._router.stack錯誤處理程序堆棧層 ,在這種情況下,它是在的 盡頭某些層陣列

  2. 增加新路線,例如:使用app.use("/something", function(req, res, next){ res.send("Lol") })

  3. 刪除錯誤處理程序層堆棧,並把它放在 路由器堆疊陣列

    // in this case, error map is array // contain index location of error handling stack layer var error_handlers = app._router.stack.splice(error_map[0], error_map.length); app._router.stack.push.apply(app._router.stack, error_handlers);

的盡頭現在你已經準備好了。

1

與快遞代碼打交道了之後,我發現這一點:

router.get('/', function(req, res) { 
    res.render('index', { 
    title: 'Express' 
    }); 
    console.log("adding route") 

    addGet('/mypath', function(req, res) { 
    res.send('hi') 
    }); 
}); 

function addGet(path, callback) { 
    Router = require('express').router; 
    // We get a layer sample so we can instatiate one after 
    layerSample = router.stack[0]; 

    // get constructors 
    Layer = layerSample.constructor; 
    Route = layerSample.route.constructor; 

    // see https://github.com/strongloop/express/blob/4.x/lib/router/index.js#L457 
    route = new Route(path); 

    var layer = new Layer(path, { 
    sensitive: this.caseSensitive, 
    strict: this.strict, 
    end: true 
    }, route.dispatch.bind(route)); 
    layer.route = route; 

    // And we bind get 
    route.get(callback) 

    // And we map it 
    router.stack.push(layer); 
} 

然後打開你的瀏覽器在localhost然後在localhost/mypath它工作!

相關問題