2016-07-05 11 views
-1

URLからの応答を変数にキャッシュし、後続の要求で送信しようとしています。このため、私は要求のデータイベントの変数に書いています。変数は更新されますが、イベントのコールバックからアクセスできません。変数がrequestJSのデータイベント内で更新されない

以下は、私が作成したコードとログです。

dataイベントコールバックで更新されるにもかかわらず、長さが0である理由は、endイベントコールバックでは理解できません。

注:data変数には、url属性、req、およびres要求変数と応答変数があります。

var cache = {} ; //global variable 
function get_from_box_cached (data,req,res){ 
    var options = _.extend({}, REQUEST_OPTIONS, {url : data.url, method: req.method}) ; 

    if (cache[data.url]){ 
     console.log(data.url + "available in cache"); 
     res.send(cache[data.url]); 
    }else{ 
     cache[data.url] =""; 
     var request_to_server = request(options); 
     request_to_server.on('data', function(data){ 
      cache[data.url] += data.toString('ascii'); 
      console.log("data event : cached : " + cache[data.url].length); 

     }); 
     request_to_server.on('end', function(){ 
      console.log("end event : cached : " + cache[data.url].length); 
     }); 
    } 
} 

ログイン:コードの呼び出し

data event : cached : 8201 
data event : cached : 8556 
data event : cached : 16393 
data event : cached : 17548 
data event : cached : 24585 
data event : cached : 32777 
data event : cached : 40969 
data event : cached : 49161 
data event : cached : 57353 
data event : cached : 65545 
data event : cached : 73737 
data event : cached : 81929 
data event : cached : 90121 
data event : cached : 98313 
data event : cached : 102941 
end event : cached : 0 

app = require('express)(); 
app.all('/abc/*',function (req, res) { 
    var data = {}; 
    data.url = SERVER_URL + "/" + url.parse(req.url).path; 
    get_from_box(data,req,res); 
}); 
+1

は、ログの最初または最後の1回限りのエントリですか?あなたの 'cache'変数はどのくらい正確に作られていますか? 'cache'は(非同期)要求が終了する前に範囲外になっているようです。 –

+0

最後に印刷された最後の1つです。 キャッシュ変数はグローバルであり、少なくともグローバルにする予定です。 リクエストが終了する前にどのように範囲外に出るのか分かりませんが、詳しく説明できますか? –

+1

リクエストが非同期であるため、リクエストが完了する前に 'get_from_box_cached'関数が返すことができます。おそらく 'キャッシュ 'は範囲外になり(クリアされ)、その間に何とか再宣言されるでしょうか? –

答えて

1

をあなたは、あなたがglobalオブジェクトを汚染しない、それがために役立つかもしれないそのように簡単なキャッシュオブジェクトモジュールを作成することができますデバッグの目的、つまり、データが変更されるたびに情報を印刷することができます(append/を使用してデータプロパティを変更するようにしてください0メソッド、直接ではありません)。

cache.js:あなたのメインスクリプトで次に

module.exports = { 
    data: [], 
    append: function(url, data) { 
     if (!this.data[url]) { this.data[url] = ''; } // initialize 
     this.data[url] += data; 
     console.log('cache[' + url + '] length:', this.data[url].length); 
    }, 
    clear: function(url) { 
     if (url) { 
      delete this.data[url]; 
      console.log('removed', url, 'from cache'); 
     } 
     else { 
      this.data = []; 
      console.log('cleared cache'); 
     } 
    } 
} 

var cache = require('./cache'); 

request_to_server.on('data', function(data) { 
    cache.append(data.url, data.toString('ascii')); 
} 

あなたもrequire()、他のスクリプト内のモジュールとそれはモジュールが中でどのように働くかあるので、それは、そのデータを保持しますすることができますNode.js

+0

ありがとう...私は別の解決策を見つけました。私は[cached-request](https://www.npmjs.com/package/cached-request)パッケージを使用しました。 ファイルシステムを使用して要求をキャッシュします。 –

関連する問題