0

I am trying to get the http get response from async function.However within the function value is displaying but return values is undefined.

Even promise not undefined values

please find code below

'use strict';
const express = require('express');
    var request = require('request');
var https = require('https');

async function getCurrencies() {
    let    response;
    try {


        var getOptions = {
            url: 'http://localhost:3000/api/currency',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            },
            json:true
        };

        await request(getOptions, function (err, res, body) {

            if (res && (res.statusCode === 200 || res.statusCode === 201)) {
        console.log(' response ', res.body.rates.INR);

            return res.body;
            } else {
                console.log('error body ', body);

            }
        });

    } catch (error) {
        console.log(" error pulling ", error);
        process.exit();
    }

}

var tt =  getCurrencies().then(function(value) {
    console.log(' tt values ',value);

}
);

below is the logs

 tt values  undefined
 response 64.945

2 Answers2

5

I'd rewrite to do something like this:

function getCurrencies() {

    return new Promise((resolve, reject) => {
        try {

            var getOptions = {
                url: 'http://localhost:3000/api/currency',
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                },
                json:true
            };

            request(getOptions, function (err, res, body) {

                if (res && (res.statusCode === 200 || res.statusCode === 201)) {
                    console.log(' response ', res.body.rates.INR);
                    resolve(res.body);
                } else {
                    console.log('error body ', body);
                    reject(new Error('Error body: ' + JSON.stringify(body)));
                }
            });

        } catch (error) {
            console.log(" error pulling ", error);
            process.exit();
        }
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
});

You can also do something a bit more compact:

const rp = require('request-promise');
function getCurrencies() {

    var getOptions = {
        url: 'http://localhost:3000/api/currency',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        json:true,
        resolveWithFullResponse: true 
    };

    return rp(getOptions).then((response) => {
        return response.body;
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
}).catch ((err) => {
    console.error('An error happened: ' + err);
});
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40
0

The request module/function doesn't return a Promise so you can't use await. You have two options:

  1. use standard node callback pattern, or
  2. switch to e.g. request-promise-native module if you insist on using async/await pattern
rtn
  • 127,556
  • 20
  • 111
  • 121