4

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

对于某些 Mongoose Model methodsstatics我们需要将Express.js Request对象作为添加的上下文信息源,例如当前正在执行请求的经过身份验证的用户。

我们目前所做的是通过原型化函数将调用的自定义属性附加到a的context上下文Model中。thisMongooseModel

问题是我们遇到了一个令人讨厌的错误,这让我们意识到,虽然在实例Model.methods上调用了, 却可以正常工作。Model

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

现在我的问题如下:

  • Express.js在和函数Mongoose中保持和访问上下文request的最佳实践是什么?Model.staticsModel.methods

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

  1. Function.bind()Model添加请求上下文的每个函数。

    -> 这意味着如果在Model.statics.a()内部调用Model.statics.b(), 函数b()不会有this.context.

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

    -> 这会很脏而且很慢。

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

    -> 与 (2) 相同,性能会受到很大影响。

有任何想法吗 ?先感谢您 !

4

1 回答 1

4

希望您仍然对答案感兴趣

您真正想要的是模仿 java 的线程本地概念,它基本上允许您在该线程的上下文中定义一些东西。

Node 是一个单线程环境,它不提供类似的东西,但domain。域在为特定操作集提供上下文和模仿线程本地存储方面非常有用。

Node 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,我将能够在任何地方访问绑定到上面创建的域的“数据”

var d = process.domain              //process.domain is always be available to you while serving the request
d.obj = {};
于 2015-11-21T08:37:57.727 回答