【问题标题】:JSON variable not retrieving updated valueJSON 变量未检索更新的值
【发布时间】:2017-12-20 04:39:07
【问题描述】:

我正在尝试发布从 JSON 文件中检索到的报价。我的代码每 20 秒发布一条推文(出于测试目的,它是 20 秒)。我可以使用 server(quoteIndex) 函数找到我的报价并将其放入 JSON 文件中。 server(quoteIndex) 将新报价添加到我的 output.json 文件中。我知道output.json 每次在偶数索引上找到引用时都会更新{"quote": ""} 部分。但是,在我的tweetIt() 函数中,当我分配var quoteFile = require("./output.json") 时,我的quoteFile.quote 值不会更新。这是一个问题,因为我的 javascript 机器人是一个 twitter 机器人,它会发布推文。而且推特不允许重复引用,给我一个“重复状态”错误。

这是主要代码

// I wanted to start at the 8th index and continue with every even index.
 var quoteIndex = 8;

 // post a tweet every 20 seconds
 setInterval(tweetIt, 1000*20);

tweetIt()

function tweetIt() {
    //
    // This will start looking for quotes to post
    // It will put the quote in a JSON file
    //
    quoteIndex = quoteIndex + 2;
    console.log('value of index: ' + quoteIndex)
    server(quoteIndex);

    var js = require('json-update');
    js.load('./output.json', function(err, obj) {
    console.log("Loaded from json:");
    console.log(obj);                 // loads most recent quote
    });                               // this is what I want to tweet


    var quoteFile = require('./output.json');

    // Read from JSON file for the quote
    var params = {
        status: quoteFile.quote       
    }                                

    //
    // prints same quote each time, does not update
    //
    console.log("quote to tweet: " + quoteFile.quote) 

    //  tweet a quote
    //
    // The first quote will tweet, however when the JSON file
    // updates, I will get a "duplicate status" error.
    // This is because my quoteFile still has not updated.
    // 
    T.post('statuses/update', params, getData);
    function getData(err, data, response) {
        if (err) {
            console.log("Something went wrong!: " + err);
        } else {
            console.log("Tweeted something!");
        }
    }
}

服务器(quoteNumber)

function server(quoteNumber) {
    var fs = require('fs');
    var request = require("request"),
    cheerio = require("cheerio"),
    url = "https://en.wikiquote.org/wiki/A_Song_of_Ice_and_Fire";


    request(url, function (error, response, body) {
      if (!error) {
        var $ = cheerio.load(body);

        var quote;
        var json = {quote : ""};

        $( "div.mw-parser-output ul" ).filter(function( INDEX ) {

            // even indexed quotes are the ones I want
            if (INDEX % 2 == 0 && (INDEX == quoteNumber)) {
              quote = $( this ).text();   
              json.quote = quote;      // this also has the most recent quote
             }
        });
      } else {
        console.log("We’ve encountered an error: " + error);
      }

  //
  // Write our quotes out to a JSON file.
  //
  fs.writeFile('output.json', JSON.stringify(json, null, 4).replace(/\\n/g, " "), function(err){
    console.log('File successfully written! - Check your project directory for the output.json file');
  })
});

基本上,当我使用 node.js 运行代码时,第一个引用会发推文,因为 JSON 文件有我的引用。然后,当需要使用 quoteIndex = quoteIndex + 2 查找下一个报价时,我的 JSON 文件会按预期在我的项目文件夹中更新。我的主要问题是在我的tweetIt() 函数中,quoteFile.quote 没有显示更新的报价,即使 JSON 文件有我更新的报价。我怎样才能获得更新的报价?

任何提示将不胜感激,谢谢。

【问题讨论】:

    标签: javascript jquery json node.js twitter


    【解决方案1】:

    每当您require() 一个文件时,无论是模块、JSON 文件还是本机插件,一旦成功加载,它就会被缓存。如果您需要能够重新加载 JSON 文件,则应改为每次手动调用 readFile()JSON.parse() 生成的文件数据。

    【讨论】:

    • 我对如何实施readFile() 感到困惑。我可以通过 fs.readFile('./output.json', ...) 来实现它,但其中的所有内容(报价数据),我将无法分配给我的 params 变量。
    • 当然可以,只需将所有逻辑放在回调中的readFile() 调用下方即可。如果您想坚持同步调用,请使用readFileSync()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多