我的路线设置如下:
app.get('/blah/:id', middleware.middleware, controller.get);
app.post('/blah/:id', middleware.middleware, controller.update);
在我的中间件中,我加载了我的资源:
module.exports.middleware = function(req, res, next){
Resource.findOne({ _id : req.params.id }, function(err, resource){
if (err){
return res.status(500).json(blahblabhblaha);
}
if (!resource){
return res.status(404).json(blahblabhblaha);
}
if (authorization condition fails){
return res.status(401).json(blahblabhblaha);
}
//more condition checking, etc
res.locals.resource = resource;
return next();
});
};
这对我很好,因为我可以一举处理所有的授权和内容。它还可以大大清理我的控制器。问题是我不能以这种方式使用mongo的投影,因为控制器需要资源的不同部分。无论如何,我可以解决这个问题而不需要让我的控制器进行数据库调用吗?
我想到解决这个问题的唯一方法是依赖注入类型,
module.exports.middleware = function(projection){
return function(req, res next){
Resource.findOne({ _id : req.params.id }, projection, function(err, resource){
//all the other stuff above
}
}
}
路线会变成这样:
app.get('/blah/:id', middleware.middleware({ foo: 1 }), controller.get);
app.post('/blah/:id', middleware.middleware({ bar: 1}), controller.update);
但是我必须在我的路由器中设置投影,这非常烦人,如果我在控制器中更改了我需要的任何东西,我必须在它的相应路线中更改它,这不是那么糟糕,但它看起来似乎非常混乱。