变量未在请求 JS 的数据事件中更新

Variable not updating inside requestJS's data event

本文关键字:数据 事件 更新 JS 请求 变量      更新时间:2023-09-26

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

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

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

注意: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);
});

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

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