node.jshttpibm-cloudibm-cloud-infrastructure

IBM - Creating a VPC using API with Node.js


I have a Node.js application which currently allows the user to provision a Digital Ocean Droplet. However, I'm now trying to migrate over to IBM Cloud and instead want to provision a Virtual Server.

The issue I'm having is I have no experience working with APIs. Digital Ocean has its own NPM package acting as a wrapper over the Digital Ocean API bit I can't find an equivalent for IBM Cloud. I've been looking through the VPC API documentation and I have gone through the entire process of creating a Virtual Server using the terminal and I've successfully provisioned a Virtual Server.

Now, I'm trying to get these cURL requests to work in Node.js. I'm starting with just the simple GET images API to try and print the available images. The command looks like this:

curl -X GET "https://eu-gb.iaas.cloud.ibm.com/v1/images?version=2019-10-08&generation=1" \
 -H "Authorization: *IAM TOKEN HERE*"

I've read over the Node HTTP documentation and so far I've converted this command to look like this:

const http = require('http')

const options = {
  hostname: 'https://eu-gb.iaas.cloud.ibm.com',
  port: 80,
  path: '/v1/images?version=2019-10-08&generation=1',
  method: 'GET',
  headers: {
    'Authorization': '*IAM TOKEN HERE*'
  }
};

const req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

req.end();

However, when I run the JS file, I get the following error:

problem with request: getaddrinfo ENOTFOUND https://eu-gb.iaas.cloud.ibm.com https://eu-gb.iaas.cloud.ibm.com:80

Can someone please explain to me the error, where I'm going wrong, and how I can fix this issue?

Many thanks in advance,

G


Solution

  • try as below:

    const https = require('https');
    const options = {
        hostname: 'eu-gb.iaas.cloud.ibm.com',
        port:  443,
        path: '/v1/images?version=2019-10-08&generation=1',
        method: 'GET',
        headers: {
            'Authorization': 'Bearer <IAM TOKEN HERE>'
        }
    };
    const req = https.request(options, (res) => {
        console.log('statusCode:', res.statusCode);
        console.log('headers:', res.headers);
    
        res.on('data', (d) => {
            process.stdout.write(d);
        });
    });
    
    req.on('error', (e) => {
        console.error(e);
    });
    req.end();
    

    The protocol http:// shouldn't be included in the host field, also, it is recommended the use of https.