我有一个脚本,它从2个API收集数据并将响应存储在文件中。它每分钟运行一次,所以我现在尝试通过缓存第一个响应来优化我的脚本,并在保存文件之前检查第二个响应的任何部分是不一样的。
我遇到了将缓存转换为可读内容的问题。我正在使用不止一次调用的res.on('data' ...
。
在保存之前是否有更好的方法来比较两个响应?我可以在不使用res.on('data'
的情况下将数据转换为人类可读的内容吗?
感谢您的帮助!
var https = require('https');
var fs = require('fs');
var cachedResponse;
function cash(res) {
return new Promise(function(resolve, reject) {
var data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
cachedResponse = data;
resolve(cachedResponse);
});
});
}
function download(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = https
.get(url, function(res) {
var oldCache = cachedResponse;
cash(res).then(res => {
console.log('CACHED', oldCache, res);
// check that new response doesn't equal oldCache before saving
res.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
});
});
})
.on('error', function(err) {
// Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
if (cb) cb(err.message);
});
}
var downloadStationAndPoints = function() {
var timestamp = new Date().getTime();
var stationsUrl = 'https://url/stations/stations.json';
var pointsUrl = 'https://url/scores';
var stationsDest = `${__dirname}/data/stations_${timestamp}_.json`;
var pointsDest = `${__dirname}/data/points_${timestamp}_.json`;
var cb = function(err) {
if (err) {
console.log('error in download at time:', timestamp, ', message:', err);
}
};
download(stationsUrl, stationsDest, cb);
download(pointsUrl, pointsDest, cb);
};
// run
setInterval(() => {
downloadStationAndPoints();
}, 5000);
答案 0 :(得分:0)
1,您可以在比较身体内容之前比较apis响应头中的content-length
吗?
2,您可以使用buf.compare()
比较编码前的内容。
3,https.get
是异步的,因为您的代码cachedResponse
可能与两个请求交错写入。
希望这些对你有用。