Node.js Javascript作用域问题

Node.js Javascript Scope Issue

本文关键字:问题 作用域 Javascript js Node      更新时间:2023-09-26

我有一个Node.js HTTP服务器运行,它是这样的(简化):

http = require('http');
help = require('./modules/help').run;
router = require('./modules/router').run;
m = {something: require('./modules/something')};
var server = http.createServer(router).listen(8001);

"help"是一组帮助函数,例如:

module.exports.run = {
  joinObjects: function(obj1, obj2) {
    for (var prop in obj2) {
       obj1[prop] = obj2[prop];
    }
    return obj1;
  }
}

"router"处理请求(向下传递请求并处理对客户端的响应):

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);
      });
    }
  }
}

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

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

问题:我对"帮助"模块的方法有什么问题?这里有一些范围问题,我不明白。

正如lazyhammer所指出的,问题在于我将对象传递给辅助函数的顺序:help.joinObjects(config.responseHeaders, response.headers) .

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