Javascript 在Mongoose模型中访问Express.js请求上下文
我正在与同事一起使用和开发RESTAPI 对于一些MongooseJavascript 在Mongoose模型中访问Express.js请求上下文,javascript,node.js,express,mongoose,mongoose-plugins,Javascript,Node.js,Express,Mongoose,Mongoose Plugins,我正在与同事一起使用和开发RESTAPI 对于一些Mongoose模型方法和静态我们需要Express.js请求对象作为添加的上下文信息源,比如当前正在执行请求的经过身份验证的用户 我们目前所做的是通过原型化Mongoose的模型函数,将一个名为上下文的自定义属性附加到模型的上下文 问题是,我们遇到了一个令人讨厌的bug,它让我们意识到,使用Model.methods(在Model实例上调用)时,它工作得很好 对于Model.statics,在Model的“类”上被调用,该类被实现为single
模型
方法
和静态
我们需要Express.js
请求
对象作为添加的上下文信息源,比如当前正在执行请求的经过身份验证的用户
我们目前所做的是通过原型化Mongoose
的模型
函数,将一个名为上下文
的自定义属性附加到模型
的上下文
问题是,我们遇到了一个令人讨厌的bug,它让我们意识到,使用Model.methods
(在Model
实例上调用)时,它工作得很好
对于Model.statics
,在Model
的“类”上被调用,该类被实现为singleton
,其作用域由整个应用程序共享,这意味着如果您有并发请求,如果您在请求处理中有任何异步行为,它们将重写彼此的this.context
值
现在我的问题是:
Express.js
和Mongoose
在Model.statics
和Model.methods
函数中保存和访问请求
上下文的最佳实践是什么
当然,有一些可能的黑客来模拟安全壳,比如:
Function.bind()
everyModel
函数添加请求上下文
->这意味着如果Model.statics.a()
在内部调用Model.statics.b()
,函数b()
就不会有This.context
在request
对象上使用with(){}
语句,并调用该范围内的每个Model
函数
->这将是相当肮脏和缓慢的
使用vm
standard Node.js模块创建具有单独作用域的容器
->与(2)相同,性能将受到很大影响
有什么想法吗?提前谢谢你 希望您仍然对答案感兴趣
您真正想要的是模仿java的线程本地概念,它基本上允许您在该线程的上下文中定义一些东西
Node是一个单线程环境,它不提供类似的功能,但提供了一个。域在为特定操作集提供上下文和模拟线程本地存储方面非常有用
Node js域很快将被弃用,但类似的解决方案如npm中提供的解决方案将解决您的问题
例如:
在请求的上下文中创建域
app.use(function(req, res, next) {
var reqDomain = domain.create();
reqDomain.run(next); //here your request context is created
});
现在,通过使用process.domain,我将能够访问绑定到上述创建域的任何位置的“数据”
var d = process.domain //process.domain is always be available to you while serving the request
d.obj = {};