【问题标题】:Mongoose pass req object to middlewareMongoose 将 req 对象传递给中间件
【发布时间】: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 角色并将模型名称传递给另一个函数以获取查找的查询条件。因此,根据用户角色和访问的模型类型,查询条件会发生变化。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案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】:

    使用

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多