Используя axios, чтобы получить внешнее изображение и затем сохранить его в файловой системе? - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующая функция, которая вызывается при каждом запросе.

async function checkForNewData() {
  var now = moment();
  var lastUpdateUnix = fs.readFileSync('.data/last-update.txt').toString();
  var lastUpdate = moment.duration(lastUpdateUnix, 'seconds');
  now.subtract(lastUpdate);
  if (now.hour() >= 1) {
    console.log("Last update is over 1 hour old. Getting new data.");
    // Schedule
    console.log("Getting new schedule.")
    let res = await axios.get('https://splatoon2.ink/data/schedules.json', { headers: { "User-Agent": "Splatoon2.ink caching server at glitch.com/~splatoon2-ink-cache" } });
    fs.writeFileSync('.data/rotations.json', JSON.stringify(res.data));
    // Image
    console.log("Getting new image.");
    let resImage = await axios.get('https://splatoon2.ink/twitter-images/schedule.png', { headers: { "User-Agent": "Splatoon2.ink caching server at glitch.com/~splatoon2-ink-cache" }, responseType: 'stream' });
    const path = Path.resolve(__dirname, '.data', 'image.png');
    const writer = fs.createWriteStream(path);
    resImage.data.pipe(writer);
    fs.writeFileSync('.data/last-update.txt', moment().unix());
    console.log("Data is now up to date.");
    return;
  }
}

На каждом экспресс-маршруте у меня есть что-то похожее на это.

app.get('/', function(request, response) {
  console.log("Request for schedule.");
  checkForNewData().then(function() {
    console.log("Sending schedule.");
    response.sendFile(__dirname + '/.data/rotations.json');
  });
});

Моя цель - запустить функцию, которая будет проверять, устарели ли текущие данные (используя библиотеку моментов), и если да, то она получает новые данные. Но по какой-то причине при использовании axios для получения части изображения оно не будет записано в файловую систему. Я пытался использовать разные подходы к его сохранению, но все, что я пробовал, не сработает.

Вот мой полный файл.

// server.js
// where your node app starts

// init project
const express = require('express');
const app = express();
const moment = require('moment');
const fs = require("fs");
const Path = require('path');
const axios = require("axios")
fs.writeFileSync('.data/last-update.txt', '0');
fs.writeFileSync('.data/rotations.json', '{}');
// we've started you off with Express, 
// but feel free to use whatever libs or frameworks you'd like through `package.json`.

// http://expressjs.com/en/starter/static-files.html
app.use(express.static('public'));

async function checkForNewData() {
  var now = moment();
  var lastUpdateUnix = fs.readFileSync('.data/last-update.txt').toString();
  var lastUpdate = moment.duration(lastUpdateUnix, 'seconds');
  now.subtract(lastUpdate);
  if (now.hour() >= 1) {
    console.log("Last update is over 1 hour old. Getting new data.");
    // Schedule
    console.log("Getting new schedule.")
    let res = await axios.get('https://splatoon2.ink/data/schedules.json', { headers: { "User-Agent": "Splatoon2.ink caching server at glitch.com/~splatoon2-ink-cache" } });
    fs.writeFileSync('.data/rotations.json', JSON.stringify(res.data));
    // Image
    console.log("Getting new image.");
    let resImage = await axios.get('https://splatoon2.ink/twitter-images/schedule.png', { headers: { "User-Agent": "Splatoon2.ink caching server at glitch.com/~splatoon2-ink-cache" }, responseType: 'stream' });
    const path = Path.resolve(__dirname, '.data', 'image.png');
    const writer = fs.createWriteStream(path);
    resImage.data.pipe(writer);
    fs.writeFileSync('.data/last-update.txt', moment().unix());
    console.log("Data is now up to date.");
    return;
  }
}

// http://expressjs.com/en/starter/basic-routing.html
app.get('/', function(request, response) {
  console.log("Request for schedule.");
  checkForNewData().then(function() {
    console.log("Sending schedule.");
    response.sendFile(__dirname + '/.data/rotations.json');
  });
});

app.get('/image', function(request, response) {
  console.log("Request for image.");
  checkForNewData().then(function() {
    console.log("Sending image.");
    response.type('png');
    response.sendFile(__dirname + '/.data/image.png');
  });
});

// listen for requests :)
const listener = app.listen(process.env.PORT, function() {
  console.log('Your app is listening on port ' + listener.address().port);
});
...