Skip to content Skip to sidebar Skip to footer

Using Node.js To Connect To A REST API

Is it sensible to use Node.js to write a stand alone app that will connect two REST API's? One end will be a POS - Point of sale - system The other will be a hosted eCommerce platf

Solution 1:

Yes, Node.js is perfectly suited to making calls to external APIs. Just like everything in Node, however, the functions for making these calls are based around events, which means doing things like buffering response data as opposed to receiving a single completed response.

For example:

// get walking directions from central park to the empire state building
var http = require("http");
    url = "http://maps.googleapis.com/maps/api/directions/json?origin=Central Park&destination=Empire State Building&sensor=false&mode=walking";

// get is a simple wrapper for request()
// which sets the http method to GET
var request = http.get(url, function (response) {
    // data is streamed in chunks from the server
    // so we have to handle the "data" event    
    var buffer = "", 
        data,
        route;

    response.on("data", function (chunk) {
        buffer += chunk;
    }); 

    response.on("end", function (err) {
        // finished transferring data
        // dump the raw data
        console.log(buffer);
        console.log("\n");
        data = JSON.parse(buffer);
        route = data.routes[0];

        // extract the distance and time
        console.log("Walking Distance: " + route.legs[0].distance.text);
        console.log("Time: " + route.legs[0].duration.text);
    }); 
}); 

It may make sense to find a simple wrapper library (or write your own) if you are going to be making a lot of these calls.


Solution 2:

Sure. The node.js API contains methods to make HTTP requests:

I assume the app you're writing is a web app. You might want to use a framework like Express to remove some of the grunt work (see also this question on node.js web frameworks).


Solution 3:

/*Below logics covered in below sample GET API    
    -DB connection created in class
    -common function to execute the query 
    -logging through bunyan library*/


const { APIResponse} = require('./../commonFun/utils');
    const createlog = require('./../lib/createlog');
    var obj = new DB();
    //Test API
    routes.get('/testapi', (req, res) => {
        res.status(201).json({ message: 'API microservices test' });
    });
    dbObj = new DB();
    routes.get('/getStore', (req, res) => {
        try {
            //create DB instance

            const store_id = req.body.storeID;
            const promiseReturnwithResult = selectQueryData('tablename', whereField, dbObj.conn);
            (promiseReturnwithResult).then((result) => {
                APIResponse(200, 'Data fetched successfully', result).then((result) => {
                    res.send(result);
                });
            }).catch((err) => { console.log(err); throw err; })
        } catch (err) {
            console.log('Exception caught in getuser API', err);
            const e = new Error();
            if (err.errors && err.errors.length > 0) {
                e.Error = 'Exception caught in getuser API';
                e.message = err.errors[0].message;
                e.code = 500;
                res.status(404).send(APIResponse(e.code, e.message, e.Error));
                createlog.writeErrorInLog(err);
            }
        }
    });

    //create connection
    "use strict"
    const mysql = require("mysql");

    class DB {
      constructor() {
        this.conn = mysql.createConnection({
          host: 'localhost',
          user: 'root',
          password: 'pass',
          database: 'db_name'
        });
      }

      connect() {
        this.conn.connect(function (err) {
          if (err) {
            console.error("error connecting: " + err.stack);
            return;
          }
          console.log("connected to DBB");
        });
      }
      //End class
    }

    module.exports = DB


    //queryTransaction.js File

    selectQueryData= (table,where,db_conn)=>{  
        return new Promise(function(resolve,reject){
          try{  
              db_conn.query(`SELECT * FROM ${table} WHERE id = ${where}`,function(err,result){
                if(err){
                  reject(err);
                }else{
                  resolve(result);
                }
            });
          }catch(err){
              console.log(err);
          }
        });
    }

    module.exports= {selectQueryData};

    //utils.js file

    APIResponse = async (status, msg, data = '',error=null) => {  
      try {
        if (status) {
          return { statusCode: status, message: msg, PayLoad: data,error:error }
        }
      } catch (err) {
        console.log('Exception caught in getuser API', err);
      }
    }

    module.exports={
      logsSetting: {
        name: "USER-API",
        streams: [
            {
                level: 'error',
                path: '' // log ERROR and above to a file
            }
        ],
      },APIResponse
    }

    //createlogs.js File

    var bunyan = require('bunyan');
    const dateFormat = require('dateformat');
    const {logsSetting} = require('./../commonFun/utils');

    module.exports.writeErrorInLog = (customError) => {
      let logConfig = {...logsSetting};
      console.log('reached in writeErrorInLog',customError)
      const currentDate = dateFormat(new Date(), 'yyyy-mm-dd');
      const path = logConfig.streams[0].path = `${__dirname}/../log/${currentDate}error.log`;
      const log = bunyan.createLogger(logConfig);
      log.error(customError);

    }

Solution 4:

A more easy and useful tool is just using an API like Unirest; URest is a package in NPM that is just too easy to use jus like

 app.get('/any-route', function(req, res){
     unirest.get("https://rest.url.to.consume/param1/paramN")
       .header("Any-Key", "XXXXXXXXXXXXXXXXXX")
       .header("Accept", "text/plain")
       .end(function (result) {
       res.render('name-of-the-page-according-to-your-engine', {
         layout: 'some-layout-if-you-want',
         markup:  result.body.any-property,
    });

});


Post a Comment for "Using Node.js To Connect To A REST API"