【问题标题】:How to implement HMVC structure in Node/Express如何在 Node/Express 中实现 HMVC 结构
【发布时间】:2014-03-29 06:17:52
【问题描述】:

我的应用程序中有几个“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但是,除非我编写了自己的不依赖于 express 的中间件实现,否则这不会给我一个可靠的方式来运行特定于端点的中间件(我也想在 HMVC 请求上运行) . 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');
   });
});

有更好的想法吗?有没有办法以编程方式访问快速路由并获得结果?

【问题讨论】:

    标签: node.js rest express hmvc


    【解决方案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)
    

    【讨论】:

    • 您应该将答案更改为不是咖啡脚本,或将原始问题更改为使用咖啡脚本。
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多