cryptoStp
cryptoStp

Reputation: 17

Why does funtion in Node return undefined?

I need to configure the base url of my endpoints after I make successful http requests (status code: 200).

I've written the below function but it's not working as I was expecting... It always returns undefined. I know it's something about promises but I don't have much experience.

const get = require('./functions/functionGET');

 function geturl() {
  var baseip;
  get(
    "username",
    "password",
    "http://**.***.**.35:8048/TESTDEV02/ODataV4/Company"
  )
    .then((response) => {
      if (response.statusCode === 200) {
        baseip = "http://**.***.**.35:8048/TESTDEV02/ODataV4/Company('*******')";
      } else {
        get(
          "username",
          "password",
          "http://**.***.**.36:8048/TESTDEV02/ODataV4/Company"
        ).then((response) => {
          if (response.statusCode === 200) {
            baseip = "http://**.***.**.36:8048/TESTDEV02/ODataV4/Company('*******')";
          } else {
            get(
              "username",
              "password",
              "http://**.***.**.37:8048/TESTDEV02/ODataV4/Company"
            ).then((response) => {
              if (response.statusCode === 200) {
                baseip = "http://**.***.**.37:8048/TESTDEV02/ODataV4/Company('*******')";
              }
            });
          }
        });
      }
    })
    console.log(baseip)
  return baseip;
}

module.exports = geturl();


EDIT

This is the get() function:

const { promisify } = require('util');
var httpntlm = require('httpntlm');
const Logger = require('../../services/error_logger')
const logger = new Logger('app')

module.exports = function (username, password, url) {
    var httpntlmGetAsync = promisify(httpntlm.get);

    return httpntlmGetAsync({
        url: url,
        username: username,
        password: password,
        workstation: '',
        domain: '',
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Accept': '*/*',
            'Content-Type': 'application/json; charset=utf-8'
        }
    })
    .catch(err => logger.error(`URL: ${url}, Error: ${err}`))
    then(response => {
        return response.body
    });
};

Upvotes: 0

Views: 59

Answers (1)

milan
milan

Reputation: 325

Looks like you need to put await before each get() method. At the same time you have to declare your function as async:

async function geturl() { //...

Without an await the next line of you code after get() gets executed regardless if get() returned anything yet. Therefore baseip is left as undefined.

EDIT: this is assuming your get() method from ./functions/functionGET is asynchronous.

Upvotes: 1

Related Questions