有没有一种方法可以将函数上下文发送到nodejs猫鼬模型中?

时间:2019-03-25 06:53:48

标签: node.js mongoose

我需要基于执行请求的用户的ID在猫鼬中实现预钩子。

我无法访问初始函数上下文(userId,权限等),无法在猫鼬式的预钩子中使用它。

let writePermissionCondition = async function(next) {
    let ctx = getCurrentContext();
    next();
}

由于我无法在猫鼬模型中发送当前上下文,因此无法访问执行实际请求的userId。

编辑:有关体系结构以及我要实现的目标的更多信息

1)用户向服务发出请求(监听事件。例如:用户/创建,用户/删除,用户/查找等)

2)该事件调用CRUD函数

3)CRUD中使用的模型具有ReadPermission和WritePermission中间件(挂钩)

4)如果实际上具有读取或写入权限,则ReadPermission和WritePermission会验证发出请求的用户。这是我需要知道什么用户尝试访问该模型的步骤。

我可能错了,应该在控制器中而不是模型中实现权限。

2 个答案:

答案 0 :(得分:0)

将其设置为global var并在猫鼬操作中使用

let writePermissionCondition = async function(next) {
    let ctx = getCurrentContext();
    global.ctx = ctx
    next();
}

现在,您可以在应用程序中的任何位置访问global.ctx

答案 1 :(得分:0)

猫鼬为解决诸如您的问题之类的复杂情况提供了许多有用的工具。

在您的情况下,您可以使用猫鼬virtuals

  

虚拟是可以获取和设置的文档属性,但是不会保留到MongoDB中。

您可以尝试使用像这样的简单实现:

yourSchema.virtual('context').
  get(function() { return this.__context; }).
  set(function(ctx) {
    this.__context = ctx; 
  });

通过这种方式,您可以在有上下文可用的地方调用getCurrentContext();(例如,在快速请求/响应流程中)并将其保存为您已检索的模型。

示例流程(伪代码):

const user = User.get(req.id)
const context = getCurrentContext();
user.context = context;
//... save/update...

现在,当将保存/更新用户并调用您的预钩子时,您的验证代码可以访问附加的context变量来检索数据。