Создание обработчика для удаленного JSON файла - PullRequest
0 голосов
/ 16 января 2020

В настоящее время у меня есть обработчик данных для удаленного файла JSON, который обновляется на сервере каждые 2 минуты, обработчик загружает файл JSON и в нем есть несколько методов, которые могут получать различную информацию из Это. Обработчик, за исключением методов, которые возвращают данные, выглядит следующим образом:

const fs = require('fs');
const request = require('request');
const EventEmitter = require('events');

class DataHandler extends EventEmitter {
    constructor() {
        super();
        this.shouldUpdate.bind(this);
    }

    updateTimer = setInterval(this.update.bind(this), 120000);

    async shouldUpdate() {
        if (!fs.existsSync('vatsimData.json')) await this.initialUpdate();

        const file = fs.readFileSync('vatsimData.json');
        const parsed = JSON.parse(file);
        const oldDT = Date.parse(parsed.updated_date);

        const dateDifference = Date.now() - oldDT;
        const minutes = Math.floor(dateDifference / 60000);

        if (minutes >= 2) await this.update();

        return false;
    }

    async update() {
        fs.copyFile('vatsimData.json', 'oldData.json', (err) => {
            if (err) console.log(err);
        });
        let body = await this.downloadFile();
        const parsedJSON = JSON.parse(body);

        parsedJSON.updated_date = new Date();
        const json = JSON.stringify(parsedJSON);
        fs.writeFileSync('vatsimData.json', json, function(err, result) {
            if(err) console.log(err);
        });
        const oldFile = fs.readFileSync('oldData.json');
        const newFile = fs.readFileSync('vatsimData.json');
        const oldParsed = JSON.parse(oldFile);
        const newParsed = JSON.parse(newFile)
        const diff = compareJson.map(oldParsed, newParsed);
        const result = {}
        for (const {type, data} of Object.values(diff.controllers)) {
            if (result[type]) {
                result[type].push(data)
             } else {
                result[type] = [data]
             }
        }
        if (result.created) {
            this.emit('newController', result.created)
        }
    }

    async initialUpdate() {
        let body = await this.downloadFile();
        const parsedJSON = JSON.parse(body);

        parsedJSON.updated_date = new Date();
        const json = JSON.stringify(parsedJSON);
        fs.writeFileSync('vatsimData.json', json, function(err, result) {
            if(err) console.log(err);
        });
    }

    downloadFile() {
        return new Promise((resolve, reject) => {
            const urlList = [
                'http://us.data.vatsim.net/vatsim-data.json',
                'http://eu.data.vatsim.net/vatsim-data.json',
                'http://apac.data.vatsim.net/vatsim-data.json'
            ];
            const url = urlList[Math.floor(Math.random()*urlList.length)];
            request(url, (error, response, body) => {
                if (error) reject(error);

                if (response.statusCode !== 200) {
                    reject('Invalid status code <' + response.statusCode + '>');
                }

                resolve(body);
            });
        });
    }

    async loadFile(){
        await this.shouldUpdate();
        return(JSON.parse(fs.readFileSync('vatsimData.json', {encoding:'utf-8'})));
    }
}

Возможно ли сделать это еще более эффективным, поскольку я не уверен, что это лучший способ, которым я могу это сделать.

...