Javascript 从Mongoose插件中的Express访问请求对象
我在ExpressJS中有一个API和一个在每个端点控制器之前执行的中间件:Javascript 从Mongoose插件中的Express访问请求对象,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我在ExpressJS中有一个API和一个在每个端点控制器之前执行的中间件: app.use(segregationMiddleware); app.get('/some-endpoint', controller1); app.get('/some-endpoint-2', controller2); segrationmiddleware用于查找请求中的一些参数,然后计算一个值,该值作为req.locals.domain存储在请求对象中,以便控制器可以访问它 在每个Mongoose模型中
app.use(segregationMiddleware);
app.get('/some-endpoint', controller1);
app.get('/some-endpoint-2', controller2);
segrationmiddleware
用于查找请求中的一些参数,然后计算一个值,该值作为req.locals.domain
存储在请求对象中,以便控制器可以访问它
在每个Mongoose模型中,我使用Mongoose插件定义了一个名为domain
的字段(因此我不必每次都这么做)。该字段用于隔离我的资产。这意味着,当segrationmiddleware
填充req.locals.domain='foo'
时,例如,如果我创建了model.find({})
,我只想获取具有{domain:'foo'}
的资产。如果我尝试更新、保存、删除等等,也会发生同样的事情
当然,我可以简单地修改每个控制器上的查询,因为我有权访问req
,但我每次都需要这样做,并且我需要记住它以进行查找、查找、更新、保存和soo。。。迟早我会忘记的
我可以在Mongoose中定义一些钩子,这些钩子将使用插件修改查询,因此它将域
约束添加到查询中,这样我就不必在控制器中执行此操作,但我在Mongoose插件中没有当前的req
对象,除非我传递它,我想到的唯一方法是在插件中抽象DB方法,所以在控制器中,我做了如下操作:
model.safeFind(req, query);
在插件中,我定义了safeFind
如下:
safeFind = () => {
const theRealQuery = Object.assign({}, query, { domain: req.locals.domain });
return this.find(query);
}
但是,通过这种方式,我需要重新定义每个DB查询函数(find、findOne、update、save…),并且我需要记住使用安全方法。再说一次,我迟早会忘记的
是否有一种方法可以让我仍然使用控制器中的常规Mongoose方法,并让插件使用当前req
对象以某种方式修改每个方法的查询