Node.js Javascript范围问题

Node.js Javascript范围问题,javascript,node.js,scope,Javascript,Node.js,Scope,我有一个Node.js HTTP服务器正在运行,如下所示(简化): “帮助”是一组功能帮助程序,例如: module.exports.run = { joinObjects: function(obj1, obj2) { for (var prop in obj2) { obj1[prop] = obj2[prop]; } return obj1; } } “路由器”处理请求(进一步向下传递请求并处理对客户端的响应): “handler”模块/函数

我有一个Node.js HTTP服务器正在运行,如下所示(简化):

“帮助”是一组功能帮助程序,例如:

module.exports.run = {
  joinObjects: function(obj1, obj2) {
    for (var prop in obj2) {
       obj1[prop] = obj2[prop];
    }
    return obj1;
  }
}
“路由器”处理请求(进一步向下传递请求并处理对客户端的响应):

“handler”模块/函数运行回调函数并将响应(代码、头和数据)传递给回调函数。回调函数然后将头与配置文件中设置的一组默认头合并

问题:当有两个连接同时调用
help.joinObjects()
时(我猜是这样),
response.headers
属性与另一个用户/连接发生冲突并返回错误数据。如果我注释掉进行合并的行,则不会发生这种情况


问题:我的“帮助”模块方法有什么问题?这里有一些我不理解的范围问题。

正如懒汉所指出的,问题在于我将对象传递到helper函数的顺序:
help.joinObjects(config.responseHeaders,response.headers)


Javascript通过引用传递变量,因此每次调用
help.joinObjects()
时,它都会覆盖config属性,而不是用户特定的对象。

可能是因为您将响应中的头合并到配置中了吧?更改
help.joinObjects(config.responseHeaders、response.headers)
help.joinObjects(response.headers、config.responseHeaders)解决你的问题?嘿!不,这不是问题所在。最后一个
headers
属性包含应该发送回完全不同的客户端(可怕!)的头。它们不是来自配置文件。问题在于,一些被认为是客户端唯一的数据实际上被两个(或更多)客户端共享,而这两个客户端恰好同时发送请求。我原以为所有的东西都封装得很好,不能在不同的连接之间共享,但事实证明并非如此。但是js是在单线程中运行的,所以没有竞争条件。你确定我的建议没有用吗?(很抱歉再次询问:))我无法使用您的修复程序重现此问题,而我的版本仍存在此问题。因此,你的建议可能已经解决或隐藏了问题,但问题是-如何解决?。。在某些情况下,两个不同的用户连接必须访问与
config.responseHeaders
response相同的作用域。返回时,标题包含可以在浏览器中检测到的标题。这个特定的头文件是从一个单独的模块返回的,我当时没有访问这个模块。所以我很确定代码中存在范围问题。好的,明白了!config位于全局(或顶部,无所谓)中,因为JavaScript通过引用传递变量,所以每次调用我的joinObjects函数时都会修改全局对象的属性(即-config属性)。我的错:(
module.exports.run = {
  joinObjects: function(obj1, obj2) {
    for (var prop in obj2) {
       obj1[prop] = obj2[prop];
    }
    return obj1;
  }
}
module.exports.run = function(req, res) {

  var urlPath = url.parse(req.url).pathname;

  switch(urlPath) {
    case '/something':
      requestHandler(req, res, 'something');
      break;
    ...
  }

  function requestHandler(req, res, handler) {
    var data = '';
    req.on('data', function(chunk) {
      data += chunk;
    }
    req.on('end', function() {
      m[handler].run(req, data, function(response) {
        response.headers = help.joinObjects(config.responseHeaders, response.headers);
        res.writeHead(response.code, response.headers);
        res.end(response.data);
      });
    }
  }

}