使用投影在中间件中加载文档?

时间:2016-03-30 20:04:28

标签: node.js express mongoose

我的路线设置如下:

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);

但是我必须在我的路由器中设置投影,这非常烦人,如果我在控制器中更改了我需要的任何东西,我必须在它的相应路线中更改它,这不是那么糟糕,但它看起来似乎非常混乱。

0 个答案:

没有答案