CatGirl19
CatGirl19

Reputation: 209

Node.js 3rd party API call using Express

Im using express with node.js & having trouble consuming data from this free api https://api.publicapis.org/entries?category=animals&https=true any feedback will be helpful!

This code outputs the following error message TypeError: Cannot read property 'body' of undefined

 request({
    method: 'GET',
    host: 'https://api.publicapis.org',
    path:  '/entries?category=animals&https=true',
 }, function (error, response, body){
    const data = response.body;
    const apiData = JSON.parse(data)
    console.log('Returned: ', apiData)
    if(!error && response.statusCode == 200){
      res.json(body);
    }
    else{
      console.log("error with api call")
    }
 })

Upvotes: 1

Views: 3668

Answers (1)

jfriend00
jfriend00

Reputation: 708016

When I run your exact code, I get an error in the error parameter. That's why both response and body are empty. You have an error. The specific error is this:

Error: options.uri is a required argument
    at Request.init (D:\code\test\temp\node_modules\request\request.js:231:31)
    at new Request (D:\code\test\temp\node_modules\request\request.js:127:8)
    at request (D:\code\test\temp\node_modules\request\index.js:53:10)
    at Object.<anonymous> (D:\code\test\temp\temp.js:3:1)
    at Module._compile (internal/modules/cjs/loader.js:956:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
    at internal/main/run_main_module.js:17:11

Always check for errors before you try to use the other parameters and log any errors and it will save you a lot of time.


If you change to this, it works for me:

const request = require('request');

request({
   method: 'GET',
   uri: 'https://api.publicapis.org/entries?category=animals&https=true',
}, function (error, response, body){
    if (error) {
        console.log(error);
        return;
    }
   const data = response.body;
   const apiData = JSON.parse(data)
   console.log('Returned: ', apiData)
   if(response.statusCode == 200){
     console.log('success');
   }
   else{
     console.log("error with api call")
   }
});

Several things to note:

  1. The request() library has been deprecated. While it will be maintained for a while (perhaps a long while), it will not be enhanced with new features any more. There's a list of alternatives that are still being actively developed here. I'm using got() because it seems very nice and simple and quick to use and it entirely promise-based.

  2. Always check for errors and log them before you try to use any of the other arguments. That will save you a ton of debugging time.

  3. When sending with res.json(), you should pass it a Javascript object, not already converted JSON. Since you already have that with data, that's what I changed your call to.

Upvotes: 1

Related Questions