变量未在 requestJS 的数据事件中更新

Variable not updating inside requestJS's data event

我正在尝试将来自 url 的响应缓存到一个变量,并在后续请求时发送它。为此,我正在根据请求的数据事件写入变量。变量已更新,但我无法从事件的回调中访问它。

下面是我生成的代码和日志。

我无法理解为什么尽管在 data 事件回调中得到更新,但它在 end 事件回调中的长度为 0。

注意:data 变量具有 url 属性,reqres 请求和响应变量。

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

你可以创建一个简单的缓存对象模块,这样你就不会污染 global 对象并且它可能有助于调试目的,即你可以在每次数据更改时打印一些信息(使确保仅使用 append/clear 方法而不是直接更改数据 属性。

例如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 中的工作方式。