如何在Node / Express中实现HMVC结构

时间:2014-03-28 21:32:51

标签: node.js rest express hmvc

我有几个" api"我的应用程序中的端点,前端框架用于其AJAX进程。出于组织目的,我想重新使用这些端点的代码来检索服务器端呈现的数据,我在某些实例中这样做可以很好地与搜索引擎一起使用。因此,理想情况下,我会实现某种HMVC设置,以便简单地访问API端点上的路由。具体来说,我希望在发出顶级响应之前获得响应并对其执行其他操作(例如,使用结果呈现视图)。

例如:

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然而,这不会给我一个可靠的方法来运行特定于端点的中间件(我也想在HMV​​C请求上运行),除非我编写了我自己的中间件实现,不依赖于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 个答案:

答案 0 :(得分:-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)