我需要基于执行请求的用户的ID在猫鼬中实现预钩子。
我无法访问初始函数上下文(userId,权限等),无法在猫鼬式的预钩子中使用它。
let writePermissionCondition = async function(next) {
let ctx = getCurrentContext();
next();
}
由于我无法在猫鼬模型中发送当前上下文,因此无法访问执行实际请求的userId。
编辑:有关体系结构以及我要实现的目标的更多信息
1)用户向服务发出请求(监听事件。例如:用户/创建,用户/删除,用户/查找等)
2)该事件调用CRUD函数
3)CRUD中使用的模型具有ReadPermission和WritePermission中间件(挂钩)
4)如果实际上具有读取或写入权限,则ReadPermission和WritePermission会验证发出请求的用户。这是我需要知道什么用户尝试访问该模型的步骤。
我可能错了,应该在控制器中而不是模型中实现权限。
答案 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
变量来检索数据。