Node.js read and write post status to a JSON file

Chris Bongers - Sep 22 '20 - - Dev Community

A while ago, I started building my RSS reader to auto-publish to certain platforms, but we never finished it 👀.

Today we will be looking into looping over the articles we get via the RSS reader and keeping track of which ones are posted to the socials.

Pre-condition: You need to know how to set up a basic node app 👈

What you'll learn from this article

  • Read data from a JSON file in Node.js
  • Write data to a JSON file in Node.js
  • Reading RSS data
  • Keeping track of run changes

Setting up our JSON file

Our JSON file is going to be quite easy in structure and will look as follows:

{
    "https://daily-dev-tips.com/posts/rss-reader-in-node-js": {
        "published": true
    },
    "https://daily-dev-tips.com/posts/top-10-chrome-extensions-for-developers-👀": {
        "published": true
    }
}
Enter fullscreen mode Exit fullscreen mode

We basically only need to know if an object is already on this list.

Looping through our RSS feed

First, we need to add the rss-parser package.

npm i rss-parser
Enter fullscreen mode Exit fullscreen mode

Then we can loop through our articles using the sitemap we have.

let Parser = require('rss-parser');
let parser = new Parser();

(async () => {
    let feed = await parser.parseURL('https://daily-dev-tips.com/sitemap.xml');

    feed.items.forEach(item => {
        console.log(item.id);
    });
})();
Enter fullscreen mode Exit fullscreen mode

Now we need to make sure we read our JSON file and see if we have already published this article.

First, let's define the file-system.

const fs = require('fs');
Enter fullscreen mode Exit fullscreen mode

Then we can read out actual JSON file

let rawdata = fs.readFileSync('site.json');
let siteData = JSON.parse(rawdata);
Enter fullscreen mode Exit fullscreen mode

This will at first we an empty object {}.

In our loop we need to check if we already published this item.
If yes => Don't do anything
If no => Do magic and then add to JSON file.

feed.items.forEach(item => {
    let url = item.id;
    if (!siteData.url) {
        // Do magic posting stuff
        siteData[url] = {
            'published': true
        };
    }
});
Enter fullscreen mode Exit fullscreen mode

Once the loop is done, we can save our JSON to the actual file.

fs.writeFileSync('site.json', JSON.stringify(siteData));
Enter fullscreen mode Exit fullscreen mode

Our JSON file will then look something like this.

{
    "https://daily-dev-tips.com/posts/vanilla-javascript-canvas-images-to-black-and-white/": {
        "published": true
    },
    "https://daily-dev-tips.com/posts/vanilla-javascript-images-in-canvas/": {
        "published": true
    },
    "https://daily-dev-tips.com/posts/vanilla-javascript-colouring-our-canvas-elements-🌈/": {
        "published": true
    }
}
Enter fullscreen mode Exit fullscreen mode

Awesome, we now parsed our RSS feed, read our JSON file, and wrote data to it if not already in there!

You can find this project on GitHub.

Thank you for reading, and let's connect!

Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .