在模块中共享响应对象,而不作为参数传递

时间:2014-10-24 09:43:03

标签: node.js express module callback

如果我将res(结果)对象分配给module级别属性,它对每个请求是唯一的,还是在回调完成覆盖之前启动的辅助请求?< / p>

var moduleData = {};

    router.route('/publishers/:id')
        .get(function(req, res) {

            var id = req.params.id;

            // Assigning the res property to a module level property called `moduleData`
            moduleData.res = res;

            db.findById('publishers', id, function(error, publishers) {

                someFurtherWork(publishers); // would rather not pass the res object around
            });

        });

function someFurtherWork(publishers) {

    someWork(publishers, function(error, data) {

         // NOW we send the data back to user... is `res` guranteed to be the same one that initiated the request?
         moduleData.res.send(data);
    });
}

路由器本身是事件驱动的,这意味着当线程可用时,每个.get()请求都作为对服务器的回调进行处理。这保证了每个响应对象对于该函数是唯一的。这里的第二个GET请求是否会覆盖模块级属性?

如果是这样,那里有什么变通方法,因为我不希望将我的响应对象传递给多个链式回调函数,直到所有数据都不会使用它们收集。

我有一个很好的理由这样做,因为如果我有一堆回调,并且一旦他们全部完成,那么我需要我的回复对象。我想如果我将响应用作模块级属性,则不需要传递它。

1 个答案:

答案 0 :(得分:1)

您的应用程序收到的每个请求的唯一范围与您提供给路由器的第一个回调的范围相同,外部范围中定义的任何变量对所有请求都是全局的。

您必须将var ModuleData = {}的声明移至回调的顶部。并且因为您在同一个回调中定义了someFurtherWork(publishers)函数,所以它将通过闭包访问ModuleData对象,您可以使用它。

如果您只需要将res对象用于嵌套回调和函数,那么只要它们都有一个共同的根作用域(即初始回调函数),您就可以使用它。关闭不是很棒!