变量未在请求 JS 的数据事件中更新
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
方法更改数据属性,而不是直接更改)。
例如缓存.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 中的工作方式。
相关文章:
- 将单击事件添加到数据表
- node.js请求数据事件未在CORS ajax调用中触发
- node exec()未触发所有数据事件
- Node.js输入数据事件停止
- 如何从节点.js请求对象读取数据事件(块)
- IE8:触发“加载元数据”事件
- Firefox 加载元数据事件
- 节点 ssh2 为一个简单的 ls 命令发送多个数据事件
- 未定义的 JWPlayer 元数据事件
- 数据事件未触发节点.js
- 具有多个“数据”事件处理程序和竞争条件的 NodeJS 流
- Nodejs正在侦听来自http.get()的数据事件的响应流
- process.stdin流的可读事件和数据事件有什么区别
- <视频>和加载的元数据事件
- 加载数据事件永远不会触发
- 用于数据事件的JavaScript选择器
- swf加载元数据事件
- 变量未在请求 JS 的数据事件中更新
- Node.js请求数据事件未触发.我做错了什么?
- 在数据事件中访问c3js中的数据值