我正与同事一起使用Express.js和Mongoose开发REST API。
对于某些Mongoose Model
methods
和statics
,我们需要Express.js
Request
对象作为添加的上下文信息源,就像当前经过身份验证的用户一样做请求。
我们目前所做的是通过原型context
的{{1}}功能将名为Model
的自定义属性附加到this
的{{1}}上下文。< / p>
问题是我们遇到了一个令人讨厌的错误,让我们意识到,Mongoose
Model
实例调用时,它可以正常工作。
对于在Model.methods
“类”上调用的Model
,实现为Model.statics
,范围由整个应用程序共享,这意味着如果您有并发请求,如果您在请求处理中有任何异步行为,它们将覆盖彼此的Model
值。
现在我的问题如下:
singleton
和this.context
用于保留和访问Express.js
和Mongoose
函数中的request
上下文的最佳做法是什么?当然有一些可能的黑客来模拟遏制,如:
Model.statics
每个Model.methods
函数都可以添加请求上下文。
- &GT;这意味着如果Function.bind()
在内部调用Model
,则函数Model.statics.a()
将没有Model.statics.b()
。
使用b()
对象上的this.context
语句,并调用该范围内的每个with() {}
函数。
- &GT;这将是非常脏和慢。
使用request
标准Node.js模块创建具有单独范围的容器。
- &GT;与(2)相同,表现将受到重创。
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
希望您仍然对答案感兴趣
你真正想要的是模仿java的线程本地概念,这基本上允许你在该线程的上下文中定义一些东西。
Node是一个单线程环境,除了domains之外,它不提供类似的东西。域在为特定操作集提供上下文和模仿线程本地存储方面非常有用。
节点js域很快就会被弃用,但类似continuation-local-storage的解决方案在npm中可用,这将解决您的目的
例如: 在请求上下文中创建域
app.use(function(req, res, next) {
var reqDomain = domain.create();
reqDomain.run(next); //here your request context is created
});
现在使用process.domain,我将能够访问数据&#39;绑定到上面创建的域名
var d = process.domain //process.domain is always be available to you while serving the request
d.obj = {};