变量未在 requestJS 的数据事件中更新
Variable not updating inside requestJS's data event
我正在尝试将来自 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
方法而不是直接更改数据 属性。
例如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 中的工作方式。
我正在尝试将来自 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
方法而不是直接更改数据 属性。
例如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 中的工作方式。