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回限りのエントリですか?あなたの 'cache'変数はどのくらい正確に作られていますか? 'cache'は(非同期)要求が終了する前に範囲外になっているようです。 –
最後に印刷された最後の1つです。 キャッシュ変数はグローバルであり、少なくともグローバルにする予定です。 リクエストが終了する前にどのように範囲外に出るのか分かりませんが、詳しく説明できますか? –
リクエストが非同期であるため、リクエストが完了する前に 'get_from_box_cached'関数が返すことができます。おそらく 'キャッシュ 'は範囲外になり(クリアされ)、その間に何とか再宣言されるでしょうか? –