Mongoose 将 req 对象传递给中间件
Posted
技术标签:
【中文标题】Mongoose 将 req 对象传递给中间件【英文标题】:Mongoose pass req object to middleware 【发布时间】:2015-09-28 15:08:26 【问题描述】:我正在为 mongoose 编写一个中间件,它使用 pre query 钩子为每个查找对象执行。
postSchema.pre('query', function(query, next)
// I want to access the req.user object here
query.populate('Category');
next();
);
对于向 api 服务器发出的每个请求,我都想访问 pre 中的 req.user 对象。如何将对象传递给中间件?
有可能吗?
https://github.com/Automattic/mongoose/issues/1931
我找到了上面的内容,但它没有谈到传递 req 对象。
=====================
在对问题有些困惑后进行编辑。
我想要完成的是获取 req.user 角色并将模型名称传递给另一个函数以获取查找的查询条件。因此,根据用户角色和访问的模型类型,查询条件会发生变化。
【问题讨论】:
【参考方案1】:将中间件包装在另一个可以访问req
的中间件中。
类似的东西,假设是快递
router.verb('/some-route', function (req, res, next)
postSchema.pre('query', function(query, next)
console.log(req);
query.populate('Category');
next();
);
);
编辑 - 仅将其附加到您想要 prehook 的路线。
免责声明 - 未经测试。
【讨论】:
这将为每个请求创建一个额外的pre
钩子(至少在 Mongoose 4.x 中,尽管 query
钩子在那里被 find
取代;也许语义也发生了变化)。它还将在从模式创建模型之后添加钩子,这意味着钩子未注册到模型。
他的问题是有可能吗?。答案是,是的,为什么不呢。
是的,他可以访问req
。
@SwarajGiri 感谢您的回复。我认为上述构造不会起作用,因为查询挂钩与模型无关。此外,这不会是可扩展的,因为对于每条路线,我都需要为每个模型添加这个 pre。我有 10 多个模型,所以插件方法是最好的。抱歉,如果我问错了问题!我想要完成的是获取 req.user 角色并将模型名称传递给另一个函数以获取查找的查询条件。任何其他可行的方法请告知
有人找到解决方案了吗?我正在尝试在预查找挂钩中获取当前登录的用户。【参考方案2】:
我知道我迟到了,但您可以使用服务在请求对象和 mongoose prehook 方法之间传递您想要的数据。在您的服务中创建私有变量来保存您要传递的数据。在您的自定义中间件中设置这些变量并调用服务 get 方法以获取 mongoose prehook 方法中的值。
【讨论】:
这似乎是评论而不是答案。【参考方案3】:使用
query.op
获取查询类型
query.options
获取其他选项,例如 runValidators: true
query._condition
获取查询条件
query._update
获取传入的body
query._fields
获取选中的字段,
您还可以将查询记录到终端以查看各种选项
【讨论】:
以上是关于Mongoose 将 req 对象传递给中间件的主要内容,如果未能解决你的问题,请参考以下文章
Node、Express、Mongoose 如何将 doc._id 从函数传递到 next() 中间件