【发布时间】:2014-09-19 23:46:40
【问题描述】:
我正在与我的同事一起使用Express.js 和Mongoose 开发一个REST API。
对于某些 Mongoose Model methods 和 statics,我们需要 Express.js Request 对象作为添加的上下文信息源,例如当前执行请求的经过身份验证的用户。
我们目前所做的是通过原型化Mongoose 的Model 函数将一个名为context 的自定义属性附加到Model 的this 上下文。
问题是我们遇到了一个令人讨厌的错误,它让我们意识到虽然在 Model 实例上调用 Model.methods 时,它可以正常工作。
对于Model.statics,他们在Model“类”上被调用,该类被实现为singleton,范围由整个应用程序共享,这意味着如果您有并发请求,它们将覆盖每个-如果您在请求处理中有任何异步行为,则为其他人的 this.context 值。
现在我的问题如下:
-
Express.js和Mongoose在Model.statics和Model.methods函数中保留和访问request上下文的最佳做法是什么?
当然有一些可能的黑客来模拟收容,例如:
-
Function.bind()每Model函数添加请求上下文。-> 这意味着如果
Model.statics.a()在内部调用Model.statics.b(),函数b()将不会有this.context。 -
在
request对象上使用with() {}语句并调用该范围内的每个Model函数。-> 这会很脏而且很慢。
-
使用
vm标准 Node.js 模块创建具有单独作用域的容器。-> 同(2),性能会受到很大影响。
有什么想法吗?提前谢谢你!
【问题讨论】:
标签: javascript node.js express mongoose mongoose-plugins