Search code examples
node.jsapiaxiosresponse

Compare API response against itself


I am trying to:

  • Poll a public API every 5 seconds
  • Store the resulting JSON in a variable
  • Store the next query to this same API in a second variable
  • Compare the first variable to the second
  • Print the second variable if it is different from the first
  • Else: Print the phrase: 'The objects are the same' if they haven't changed

Unfortunately, the comparison part appears to fail. I am realizing that this implementation is probably lacking the appropriate variable scoping but I can't put my finger on it. Any advice would be highly appreciated.

  data: {
    chatters: {
        viewers: {
        },
    },
  },
};

//prints out pretty JSON
function prettyJSON(obj) {
  console.log(JSON.stringify(obj, null, 2));
}

// Gets Users from Twitch API endpoint via axios request
const getUsers = async () => {
  try {
    return await axios.get("http://tmi.twitch.tv/group/user/sixteenbitninja/chatters");
  } catch (error) {
    console.error(error);
  }
};

//Intended to display 
const displayViewers = async (previousResponse) => {
  const usersInChannel = await getUsers();
  if (usersInChannel.data.chatters.viewers === previousResponse){
      console.log("The objects are the same");
  } else {      
      if (usersInChannel.data.chatters) {
            prettyJSON(usersInChannel.data.chatters.viewers);
            const previousResponse = usersInChannel.data.chatters.viewers;
            console.log(previousResponse);
            intervalFunction(previousResponse);
        }
   } 

};

// polls display function every 5 seconds
const interval = setInterval(function () {
    // Calls Display Function
    displayViewers()
}, 5000);```

Solution

  • The issue is that you are using equality operator === on objects. two objects are equal if they have the same reference. While you want to know if they are identical. Check this:

    console.log({} === {})

    For your usecase you might want to store stringified version of the previousResponse and compare it with stringified version of the new object (usersInChannel.data.chatters.viewers) like:

        console.log(JSON.stringify({}) === JSON.stringify({}))

    Note: There can be issues with this approach too, if the order of property changes in the response. In which case, you'd have to check individual properties within the response objects.