Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为远程JSON文件创建处理程序_Node.js_Json_Handler_Api Design - Fatal编程技术网

Node.js 为远程JSON文件创建处理程序

Node.js 为远程JSON文件创建处理程序,node.js,json,handler,api-design,Node.js,Json,Handler,Api Design,我目前有一个远程JSON文件的数据处理程序,它每2分钟在服务器上更新一次,处理程序下载JSON文件,其中有一些方法可以从中获取不同的信息。处理程序减去返回数据的方法,如下所示 const fs = require('fs'); const request = require('request'); const EventEmitter = require('events'); class DataHandler extends EventEmitter { constructor()

我目前有一个远程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'})));
    }
}
const fs=require('fs');
const request=require('request');
const EventEmitter=require('events');
类DataHandler扩展了EventEmitter{
构造函数(){
超级();
this.shouldUpdate.bind(this);
}
updateTimer=setInterval(this.update.bind(this),120000);
异步shouldUpdate(){
如果(!fs.existsSync('vatsimData.json'))等待此.initialUpdate();
const file=fs.readFileSync('vatsimData.json');
const parsed=JSON.parse(文件);
const oldDT=Date.parse(parsed.updated_Date);
const dateDifference=Date.now()-oldDT;
常数分钟=数学楼层(日期差/60000);
如果(分钟>=2)等待此更新();
返回false;
}
异步更新(){
fs.copyFile('vatsimData.json','oldData.json',(err)=>{
if(err)console.log(err);
});
让body=wait this.downloadFile();
const parsedJSON=JSON.parse(body);
parsedJSON.updated_date=新日期();
const json=json.stringify(parsedJSON);
fs.writeFileSync('vatsimData.json',json,函数(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);
常量结果={}
对象值(差异控制器)的(常量{type,data}){
如果(结果[类型]){
结果[类型]。推送(数据)
}否则{
结果[类型]=[数据]
}
}
if(result.created){
this.emit('newController',result.created)
}
}
异步初始化更新(){
让body=wait this.downloadFile();
const parsedJSON=JSON.parse(body);
parsedJSON.updated_date=新日期();
const json=json.stringify(parsedJSON);
fs.writeFileSync('vatsimData.json',json,函数(err,result){
if(err)console.log(err);
});
}
下载文件(){
返回新承诺((解决、拒绝)=>{
常量URL列表=[
'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=urlist[Math.floor(Math.random()*urlist.length)];
请求(url,(错误、响应、正文)=>{
如果(错误)拒绝(错误);
如果(response.statusCode!==200){
拒绝(“无效状态代码”);
}
决议(机构);
});
});
}
异步加载文件(){
等待此消息。shouldUpdate();
返回(JSON.parse(fs.readFileSync('vatsimData.JSON',{encoding:'utf-8'}));
}
}

由于我不确定这是否是我能做到的最好的方法,是否有可能提高效率。

这可能太开放,需要关注对其他用户有用的问题,并实际得到回答。@DrCord您建议如何使其更具体?您希望解决的具体问题,而不是“使其更干净”. 例如:如果你想让它跑得更快。在这种情况下,“清洁剂”这个词太开放了——它对你的意义可能与其他人的想法不同。。。也许你正试图减少代码行数,也许试图提高速度,也许试图在语言中使用更多的内置功能。。。等等,我现在已经更新了,你认为哪些具体部分需要优化?