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()同時に呼び出している 2 つの接続がある場合(それは私の推測です)、response.headersプロパティが別のユーザー/接続のものと衝突し、不正なデータを返します。マージを行う行をコメントアウトすると、これは発生しません。

質問:「ヘルプ」モジュールに対する私のアプローチの何が問題になっていますか? ここで理解できないスコープの問題があります。

4

1 に答える 1

0

lazyhammerが指摘したように、問題はオブジェクトをヘルパー関数に渡す順序でした:help.joinObjects(config.responseHeaders, response.headers) .

Javascript は参照によって変数を渡すため、呼び出されるたびhelp.joinObjects()に、ユーザー固有のオブジェクトではなく config プロパティを上書きします。

于 2013-03-24T14:56:55.507 に答える