Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Mongoose模型中访问Express.js请求上下文_Javascript_Node.js_Express_Mongoose_Mongoose Plugins - Fatal编程技术网

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

Javascript 在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

我正在与同事一起使用和开发RESTAPI

对于一些Mongoose
模型
方法
静态
我们需要
Express.js
请求
对象作为添加的上下文信息源,比如当前正在执行请求的经过身份验证的用户

我们目前所做的是通过原型化
Mongoose
模型
函数,将一个名为
上下文
的自定义属性附加到
模型
上下文

问题是,我们遇到了一个令人讨厌的bug,它让我们意识到,使用
Model.methods
(在
Model
实例上调用)时,它工作得很好

对于
Model.statics
,在
Model
的“类”上被调用,该类被实现为
singleton
,其作用域由整个应用程序共享,这意味着如果您有并发请求,如果您在请求处理中有任何异步行为,它们将重写彼此的
this.context

现在我的问题是:

  • Express.js
    Mongoose
    Model.statics
    Model.methods
    函数中保存和访问
    请求
    上下文的最佳实践是什么
当然,有一些可能的黑客来模拟安全壳,比如:

  • Function.bind()
    every
    Model
    函数添加请求上下文

    ->这意味着如果
    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 = {};