我有几个" 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
。 然而,这不会给我一个可靠的方法来运行特定于端点的中间件(我也想在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');
});
});
有更好的想法吗?有没有办法以编程方式访问快速路线并获得结果?
答案 0 :(得分:-1)
我通过深入了解Express源代码来解决这个问题。有一个名为handle
的方法,我可以使用修改后的request
和response
对象手动调用它来获得我想要的效果:
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)