节点:在内存缓存比较中

时间:2017-12-23 05:12:01

标签: javascript node.js caching server

我有一个脚本,它从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);

1 个答案:

答案 0 :(得分:0)

1,您可以在比较身体内容之前比较apis响应头中的content-length吗?

2,您可以使用buf.compare()比较编码前的内容。

3,https.get是异步的,因为您的代码cachedResponse可能与两个请求交错写入。

希望这些对你有用。