2012-10-04 81 views
28

我正在使用Express在node.js中編寫Web應用程序。我已經定義了一條路線如下:在Express NodeJS的其他路由中調用已定義的路由

app.get("/firstService/:query", function(req,res){ 
    //trivial example 
    var html = "<html><body></body></html>"; 
    res.end(html) 
}); 

如何從express內重用該路由?

app.get("/secondService/:query", function(req,res){ 
    var data = app.call("/firstService/"+query); 
    //do something with the data 
    res.end(data); 
}); 

我在API文檔中找不到任何東西,寧願不使用另一個庫,比如「請求」,因爲這看起來很糟糕。我試圖讓我的應用盡可能模塊化。思考?

感謝

回答

13

你能簡單地打破了這一點到另一個函數,把它放在一個共享點,並從那裏走?

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res); 

app.get('/firstService/:query', queryHandler.firstService); 

// second app 
app.get('/secondService/:query', queryHandler.secondService); 

老實說,這整個嵌套調用回app.get(...)內的業務是不是一個真正的偉大實踐。你最終得到一個包含所有核心代碼的巨大文件。

你真正想要的是一個填充了app.get()app.post()語句的文件,所有的回調處理程序都生活在不同的,更好組織的文件中。

+1

謝謝!我只是一個Express初學者,他正試圖處理一個變得笨拙的項目。任何關於中級到高級快遞教程/幫助網站的建議? – user1148710

21

與蓋茨所說的相似,但我會將function(req, res){}保留在您的路線文件中。所以我會做這樣的事情,而不是:

routes.js

var myModule = require('myModule'); 

app.get("/firstService/:query", function(req,res){ 
    var html = myModule.firstService(query); 
    res.end(html) 
}); 

app.get("/secondService/:query", function(req,res){ 
    var data = myModule.secondService(query); 
    res.end(data); 
}); 

然後你的模塊中有你的邏輯分割,像這樣:

myModule.js

var MyModule = function() { 
    var firstService= function(queryParam) { 
     var html = "<html><body></body></html>"; 
     return html; 
    } 

    var secondService= function(queryParam) { 
     var data = firstService(queryParam); 
     // do something with the data 
     return data; 
    } 

    return { 
     firstService: firstService 
     ,secondService: secondService 
    } 
}(); 

module.exports = MyModule; 
0

您可以正好使用run-middleware模塊

app.runMiddleware('/firstService/query',function(responseCode,body,headers){ 
    // Your code here 
}) 

更多信息:

披露:我是這個模塊的維護者&第一顯像。在userpage.js

router.createSitemap = function(req, res, callback) { code here callback(value); } 

在product.js :

+0

這可以與路由器一起使用嗎?如果是的話,我將怎麼做呢?謝謝! – Shaun

+0

Morgan正在顯示運行中間件調用的路由的錯誤信息。任何幫助@aminadav –

3

如果你有很多中間件的路線,你可以從傳播中受益:

const router = express.Router(); 

const myMiddleware = [ 
    authenticationMiddleware(), 
    validityCheckMiddleware(), 
    myActualRequestHandler 
]; 

router.get("/foo", ...myMiddleware); 
router.get("/v1/foo", ...myMiddleware); 
+1

根據http://expressjs.com/en/guide/routing.html示例:'app.get('/ example/c',[cb0,cb1,cb2])',看起來你不會甚至需要傳播運營商。很高興知道,無論哪種方式! – ryanm

+0

@ryanm Huh。好的趕上! –

0

我用下面的方式

var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function() { 
          //console.log('sitemap'); 
         }); 

還可以在同一userpage.js路由器使用,我可以使用其他路由作爲 好。例如。

router.get('/sitemap', function (req, res, next) { 
    router.createSitemap(req, res, function() { 
     res.redirect('/sitemap.xml'); 
    }); }); 

希望這會有所幫助。