Node.js 如何使用fs.watchFile重新加载Json文件

Node.js 如何使用fs.watchFile重新加载Json文件,node.js,Node.js,我有两个函数可以重新构造JSON文件。他们互相书写和操纵。它们在同一个js文件中。每个函数在正常运行之前都依赖于函数。但是,由于他们中的每一个人在阅读文件后都会同步操作文件,因此我遇到了一个很难解释的问题,因为我不确定自己是否理解得很好。当第一个函数完成任务时,第二个函数无法读取它(它读取但看不到更新的对象及其属性)。如果我一个接一个地运行所有函数,然后重新启动程序,它的可读性非常好。这就是我迄今为止所尝试的 我试图使我的函数异步 我尝试使用setTimeout函数,直到10秒后才放弃 这两

我有两个函数可以重新构造JSON文件。他们互相书写和操纵。它们在同一个js文件中。每个函数在正常运行之前都依赖于函数。但是,由于他们中的每一个人在阅读文件后都会同步操作文件,因此我遇到了一个很难解释的问题,因为我不确定自己是否理解得很好。当第一个函数完成任务时,第二个函数无法读取它(它读取但看不到更新的对象及其属性)。如果我一个接一个地运行所有函数,然后重新启动程序,它的可读性非常好。这就是我迄今为止所尝试的

  • 我试图使我的函数异步
  • 我尝试使用setTimeout函数,直到10秒后才放弃
这两个都不适合我。我在StackOverflow中读到it fs.watch可以帮助我,但找不到关于如何实现它的正确解释。任何关于这个问题的帮助,我将不胜感激

-我知道我可以使用另一个数据库,但我只想知道这个,因为我经常使用这个。如果我愚蠢,请不要无礼:P 我只是想知道,每当文件发生更改时,如何重新加载这个ReadParsed,并从函数中获得重新加载的版本

这是我的全部代码;这是testing2.js

const request = require('request');
const cherio= require('cheerio');
const fs = require('fs');
const cheerioTableparser = require('cheerio-tableparser');


async function htmlCollector () {
    const ReadTransactionBase = await fs.readFileSync('transactionDatabase.json');
    const ReadTransaction = JSON.parse(ReadTransactionBase);
    ReadTransaction.pageInformation = "";
    let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
    fs.writeFileSync('transactionDatabase.json', editedDataBase);
    for (let counter = 1; counter <= ReadTransaction.maxPage; counter++) {
        request(ReadTransaction.link + counter,
            (error, response, html) => {
                if (!error && response.statusCode === 200) {
                    const $ = cherio.load(html);
                    const items = [];
                    $('#maindiv').each(function (i, elem) {
                        items[i] = $(this).html();
                    });
                    let newPage = {['PageNumber'+counter] : items};
                    ReadTransaction.pageInformation = Object.assign(newPage,ReadTransaction.pageInformation);
                    let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
                    fs.writeFileSync('transactionDatabase.json', editedDataBase);
                }
            })
    }
}

async function databaseModifier () {
    const ReadTransactionBase = await fs.readFileSync('transactionDatabase.json');
    const ReadTransaction = JSON.parse(ReadTransactionBase);
    delete ReadTransaction.from;
    delete ReadTransaction.quantities;
    delete ReadTransaction.orangeBox;
    let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
    console.log('test');
    fs.writeFileSync('transactionDatabase.json', editedDataBase);
    for (let i=1; i<=Object.keys(ReadTransaction.pageInformation).length;i++) {
        let nums = 'PageNumber' + i;
        let newObject = {[nums]: {}};
        ReadTransaction.from = Object.assign(newObject,ReadTransaction.from);
        ReadTransaction.orangeBox = Object.assign(newObject,ReadTransaction.orangeBox);
        ReadTransaction.quantities = Object.assign(newObject,ReadTransaction.quantities);
        let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
        fs.writeFileSync('transactionDatabase.json', editedDataBase);
    }
}

async function fromOrangeBoxQuantities () {
    const ReadTransactionBase = await fs.readFileSync('transactionDatabase.json');
    const ReadTransaction = JSON.parse(ReadTransactionBase);
    for (let counter = 1; counter <= ReadTransaction.maxPage ; counter++) {
        let HTMLPageNumber = 'PageNumber' + counter;
        let $ = cherio.load(ReadTransaction.pageInformation[HTMLPageNumber][0]);
        cheerioTableparser($);
        let data = $('.table').parsetable(true,true,true);
        for (let sCounter = 1; sCounter <= data[2].length; sCounter++) {
            let fromTable = {[sCounter] : [data[2][sCounter-1]]};
            let orangeBoxTable = {[sCounter] : [data[3][sCounter-1]]};
            let quantityTable = {[sCounter] : [data[5][sCounter-1]]};
            ReadTransaction.from[HTMLPageNumber] = Object.assign(fromTable,ReadTransaction.from[HTMLPageNumber]);
            ReadTransaction.orangeBox[HTMLPageNumber] = Object.assign(orangeBoxTable,ReadTransaction.orangeBox[HTMLPageNumber]);
            ReadTransaction.quantities[HTMLPageNumber] = Object.assign(quantityTable,ReadTransaction.quantities[HTMLPageNumber]);
            let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
            fs.writeFileSync('transactionDatabase.json', editedDataBase);
        }
    }
}

async function validatorOfTransactions (){
    const ReadTransactionBase = await fs.readFileSync('transactionDatabase.json');
    const ReadTransaction = JSON.parse(ReadTransactionBase);
    ReadTransaction.validQuantities = [];
    let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
    fs.writeFileSync('transactionDatabase.json', editedDataBase);
    for (let counter = 1; counter <= ReadTransaction.maxPage ; counter++) {
        let HTMLPageNumber = 'PageNumber' + counter;
        let length = Object.keys(ReadTransaction.from[HTMLPageNumber]).length;
        for (let sCounter = 1; sCounter <= length; sCounter++) {
            let a = ReadTransaction.from[HTMLPageNumber][sCounter].toString();
            let b = ReadTransaction.fromAddress;
            let c = ReadTransaction.orangeBox[HTMLPageNumber][sCounter].toString();
            let d = ReadTransaction.OrangeBox;
            if (a === b && c === d) {
                console.log('yay');
                ReadTransaction.validQuantities.push(parseFloat(ReadTransaction.quantities[HTMLPageNumber][sCounter].toString().replace(/,/g,'')));
                let editedDataBase = JSON.stringify(ReadTransaction, null, 2);
                fs.writeFileSync('transactionDatabase.json', editedDataBase);
            }
        }
    }
}

async function finalizeCalculation () {
    const ReadTransactionBase = await fs.readFileSync('transactionDatabase.json');
    const ReadTransaction = JSON.parse(ReadTransactionBase);
    let NewArray = ReadTransaction.validQuantities;
    return NewArray.reduce((a,b) => a +b, 0);
}


module.exports = {
    htmlCollector : htmlCollector,
    databaseModifier : databaseModifier,
    fromOrangeBoxQuantities : fromOrangeBoxQuantities,
    validatorOfTransactions : validatorOfTransactions,
    finalizeCalculation : finalizeCalculation
};
这是newtest.js

let testing2 = require('./testing2');

testing2.htmlCollector().then(() => testing2.databaseModifier().then(()=> testing2.fromOrangeBoxQuantities().then(()=> testing2.validatorOfTransactions().then())));
这是我得到的错误


(节点:21760)未经处理的PromisejectionWarning:TypeError:无法读取未定义的属性“0”

我还尝试将每个函数分离到另一个文件中,并以这种方式进行操作,但效果不佳。如果没有其他进程写入JSON文件,则无需观看。如果第二个函数实际上没有读取第一个函数的输出,则可能是您没有正确写入内容。你能用读写功能更新两个后续函数的简化版本吗?@dereli这些函数正在用fs.writeFileSync写入我的JSON文件,但问题是js文件在我调用该函数时试图在写入之前读取它。如果你同步并正确关闭文件,在前一个文件写入之前不应读取。如果文章中没有更多的代码,我将无能为力。@dereli请检查主题,我正在发布我的代码。
{
  "link": "https://etherscan.io/token/generic-tokentxns2?contractAddress=0xaf2de5cb07d8f5de2369ff104150fef9dc0e604b&mode=&a=0x11209cbc2ea8cf829aa5aa1cdc5a4e5962e70655&p=",
  "maxPage": 12,
  "fromAddress": "0x11209cbc2ea8cf829aa5aa1cdc5a4e5962e70655",
  "OrangeBox": "OUT",
  "validQuantities": [],
  "pageInformation": {}
}
let testing2 = require('./testing2');

testing2.htmlCollector().then(() => testing2.databaseModifier().then(()=> testing2.fromOrangeBoxQuantities().then(()=> testing2.validatorOfTransactions().then())));