2014-03-28 64 views
0

我的應用程序中有幾個「api」端點,前端框架使用它的AJAX進程。出於組織目的,我想重新使用這些端點的代碼來檢索服務器端呈現的數據,在某些情況下,我可以使用這些數據來與搜索引擎良好地配合。所以,理想情況下,我會實現某種HMVC設置,以簡單地訪問API端點上的路由。具體而言,我想在發佈頂級響應之前獲得響應並對其執行其他操作(例如,呈現帶有結果的視圖)。如何在Node/Express中實現HMVC結構

例如:

app.get('/post/recent', function(req, res) { 
    app.doRequest('/api/posts/', req, function(res2) { 
     var data = res2.body; 
     res.render('posts/index', data); 
    }); 
}); 

什麼是做到這一點的最好方法是什麼?

到目前爲止,我想出最好的辦法是:

揭露所有邏輯端點作爲一種方法,這將在app.get('...', myFunction)使用,然後我其他地方打電話myFunction快遞流程之外爲那條道路。 然而,,這不會給我一個可靠的方式來運行特定於端點的中間件(我也想運行在HMVC請求上),除非我編寫了我自己的中間件實現,它不依賴於express。 API端點具有中間件,它執行類似if(!hasAccess) res.send(403)這樣的事情,我特別不希望發生在我的主要路由中,因爲我想渲染一個好的錯誤頁面,而不是僅發送錯誤代碼。

例子:

var getPosts = function(req) { 
    var deferred = q.defer() 
    doDatabaseQuery(req.query).then(function(response) { 
     deferred.resolve(response) 
    }); 
}; 
app.get('/api/posts', myMiddlewareFunction(), function(req, res) { 
    getPosts(req).then(function(response) { 
     res.send(response); 
    }); 
); 
app.get('/post/recent', function(req, res) { 
    // I want to run middleware here, not in root level 
    getPosts(req).then(function(response) { 
     res.render('post/index', response); 
    }, function(err) { 
     res.render('error/noaccess'); 
    }); 
}); 

更好的想法?有沒有辦法以編程方式訪問快速路線並獲得結果?

回答

-1

我想通過深入瞭解Express源代碼來解決這個問題。有一個叫handle方法,我可以手動改良requestresponse對象調用來獲得我想要的效果:

app.get '/posts', (req, res) -> 
req.url = '/api/posts' 
newRes = _.clone(res) 
newRes.send = (data, code)-> 
    if code is 200 
     return res.render('posts/index', data) 
    else 
     return res.render('error') 
app.handle(req, newRes) 
+0

您應該更改答案不會是咖啡的腳本,或者原來的問題使用咖啡腳本。 – jemiloii