Mongoose将req对象传递给中间件

9

我正在编写一个mongoose中间件,它会在每次使用pre query钩子执行查找对象时被调用。

postSchema.pre('query', function(query, next) {
// I want to access the req.user object here
    query.populate('Category');
    next();
});

我希望在每次请求 api 服务器时能够访问 req.user 对象的内容。如何将该对象传递给中间件?

这是否可能实现?

https://github.com/Automattic/mongoose/issues/1931

我找到了上述内容,但它没有讲解如何传递req对象。

====================

在一些问题的混淆后进行编辑。

我试图实现的是获取req.user角色和模型名称,将其传递给另一个函数以获取用于查找的查询条件。因此,根据用户角色和访问的模型类型,查询条件将发生变化。

4个回答

0

将中间件包装在另一个可以访问req的中间件中。

类似于以下示例,假设使用express:

router.verb('/some-route', function (req, res, next) {
   postSchema.pre('query', function(query, next) {
      console.log(req);
      query.populate('Category');
      next();
   });
});

编辑 - 仅将此附加到您想要预挂钩的路由。

免责声明 - 未经测试。


1
这将为每个请求创建一个额外的 pre 钩子(至少在 Mongoose 4.x 中是这样,尽管 query 钩子被 find 取代了;也许语义也发生了变化)。它还会在从模式创建模型之后添加钩子,这意味着钩子未注册到模型。 - robertklep
他的问题是“这真的可能吗?”。而答案是,“当然可以,为什么不呢?” - Swaraj Giri
是的,这将使他可以访问 req - Swaraj Giri
@SwarajGiri 谢谢您的回复。我认为上述结构不会起作用,因为查询钩子没有与模型关联。此外,这种方法不可扩展,因为对于每个路由,我都需要为每个模型添加此前缀。我有10多个模型,因此最好采用插件方法。如果我提出了错误的问题,请原谅!我想要实现的是获取req.user角色和模型名称,并将其传递给另一个函数以获取find的查询条件。如果有其他可行的方法,请建议。 - Uma Maheshwaraa
1
有人找到解决办法了吗?我正在尝试在预查找钩子中获取当前登录的用户。 - nacho

0

是的,这是可能的。

restify.serve(router, model, {
   preCreate: function (req, res, next) {
       req.body.createdBy = req.user._id
       next()
   }
})

请查看 this 文档


0

我知道自己来晚了,但是您可以使用服务在请求对象和mongoose prehook方法之间传递所需数据。在您的服务中创建私有变量以保存要传递的数据。在自定义中间件中设置这些变量,并调用服务获取方法以在mongoose prehook方法中获取值。


这似乎是一条注释而不是答案。 - Lajos Arpad

0

使用

  1. query.op 获取查询类型
  2. query.options 获取其他选项,例如{runValidators: true}
  3. query._condition 获取查询条件
  4. query._update 获取传入的正文体
  5. query._fields 获取选定的字段,

您也可以将查询记录到终端以查看各种选项


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接