在Mongoose模型中访问Express.js请求上下文

时间:2014-07-28 17:48:59

标签: javascript node.js express mongoose mongoose-plugins

我正与同事一起使用Express.jsMongoose开发REST API。

对于某些Mongoose Model methodsstatics,我们需要Express.js Request对象作为添加的上下文信息源,就像当前经过身份验证的用户一样做请求。

我们目前所做的是通过原型context的{​​{1}}功能将名为Model的自定义属性附加到this的{​​{1}}上下文。< / p>

问题是我们遇到了一个令人讨厌的错误,让我们意识到,Mongoose Model实例调用时,它可以正常工作。

对于在Model.methods“类”上调用的Model,实现为Model.statics,范围由整个应用程序共享,这意味着如果您有并发请求,如果您在请求处理中有任何异步行为,它们将覆盖彼此的Model值。

现在我的问题如下:

  • singletonthis.context用于保留和访问Express.jsMongoose函数中的request上下文的最佳做法是什么?

当然有一些可能的黑客来模拟遏制,如:

  1. Model.statics每个Model.methods函数都可以添加请求上下文。

    - &GT;这意味着如果Function.bind()在内部调用Model,则函数Model.statics.a()将没有Model.statics.b()

  2. 使用b()对象上的this.context语句,并调用该范围内的每个with() {}函数。

    - &GT;这将是非常脏和慢。

  3. 使用request标准Node.js模块创建具有单独范围的容器。

    - &GT;与(2)相同,表现将受到重创。

  4. 有什么想法吗?提前谢谢!

1 个答案:

答案 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 = {};