Search code examples
javascriptnode.jsjsonapireddit

Get a particular URL in Node JS other ways


I have a REST API of Reddit. I am trying to parse the JSON output to get the URL of the responses. When I try to send the request, I get multiple outputs, but I am not sure how to do it as it's a random response.

https
  .get("https://www.reddit.com/r/cute/random.json", resp => {
    let data = "";

    resp.on("data", chunk => {
      data += chunk;
    });

    const obj = JSON.parse(data);
    resp.on("end", () => {
      console.log(obj.url);
    });
  })
  .on("error", err => {
    console.log("Error: " + err.message);
  });

This is the code I have got. I used the default Node's http library and I don't think it worked. I have never used any Node Libraries, so it will be helpful if you can suggest them too. And also let me know if what I have done is right.


Solution

  • I understand that http is a core library of Node JS, but I strongly suggest you to use something like node-fetch. Make sure you run the following command on your terminal (or cmd) where your package.json file exists:

    $ npm install node-fetch
    

    This will install the node-fetch library, which acts similarly to how the Web based fetch works.

    const fetch = require("node-fetch");
    const main = async () => {
      const json = await fetch("https://www.reddit.com/r/cute/random.json").then(
        res => res.json()
      );
      console.log(
        json
          .map(entry => entry.data.children.map(child => child.data.url))
          .flat()
          .filter(Boolean)
      );
    };
    main();
    

    The URLs that you are looking for, I could find in the data.children[0].data.url so I did a map there. I hope this is something that might help you.

    I get multiple output for the same code, run multiple times, because the URL you have used is a Random Article Fetching URL. From their wiki:

    /r/random takes you to a random subreddit. You can find a link to /r/random in the header above. Reddit gold members have access to /r/myrandom, which is right next to the random button. Myrandom takes you to any of your subscribed subreddits randomly. /r/randnsfw takes you to a random NSFW (over 18) subreddit.

    The output for me is like this:

    [ 'https://i.redd.it/pjom447yp8271.jpg' ]   // First run
    [ 'https://i.redd.it/h9b00p6y4g271.jpg' ]   // Second run
    [ 'https://v.redd.it/lcejh8z6zp271' ]       // Third run
    

    Since it has only one URL, I changed the code to get the first one:

    const fetch = require("node-fetch");
    const main = async () => {
      const json = await fetch("https://www.reddit.com/r/cute/random.json").then(
        res => res.json()
      );
      console.log(
        json
          .map(entry => entry.data.children.map(child => child.data.url))
          .flat()
          .filter(Boolean)[0]
      );
    };
    main();
    

    Now it gives me:

    'https://i.redd.it/pjom447yp8271.jpg'   // First run
    'https://i.redd.it/h9b00p6y4g271.jpg'   // Second run
    'https://v.redd.it/lcejh8z6zp271'       // Third run
    'https://i.redd.it/b46rf6zben171.jpg'   // Fourth run
    

    Preview

    preview

    I hope this helps you. Feel free to ask me if you need more help. Other alternatives include axios, but I am not sure if this can be used on backend.