0

我有一个 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;
  }
}

“路由器”处理请求(进一步向下传递并处理对客户端的响应):

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

}

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

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

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

4

1 回答 1

0

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

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

于 2013-03-24T14:56:55.507 回答