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 对象传递给中间件的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 Laravel 中的中间件

Node、Express、Mongoose 如何将 doc._id 从函数传递到 next() 中间件

如何使用把手将 req 参数传递给 js?

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

使用 promise/thunk 通过 action 将参数传递给 reducer

将模型参数传递给猫鼬模型