0

I've been working with the Microsoft Bot Framework to create a bot that can interface between MS Teams and AWS. I've been trying to write some JS functions but have been unsuccessful in getting them to operate how I want them to.

Here is what I am currently working on and am stuck on:

I am creating a 'ping' like functionality so a bot user can ping an instance in AWS and receive its status whether its running and has passed the system checks or not. My code is currently able to take the user request for the ping, retrieve the information from AWS, and can even print that info to the console. However, when I am trying to retrieve that information back out of the object that I set it to and print it to MS Teams, it says my variable is undefined.

Some code snippets are below:

class aws_Link {
constructor (mT, ping_1, i_state, i_status) {
    this.myTag = mT;
    this.ping = ping_1;
    this.instance_state = i_state; // I declare this here, but should I?
    this.instance_status = i_status; // I declare this here, but should I?
} 
//i_state and i_status are just passed NULL when the object is initialized 
//so they would be holding some value, not sure if I have to do this

api_link () {
    var mainLink = API_LINK_TAKEN_OUT_FOR_OBVIOUS_REASONS;
    var myTagFill = "myTag=";
    var ampersand = "&";
    var pingFill = "ping=";
    var completeLink = String(mainLink + myTagFill + this.myTag + ampersand + pingFill + this.ping);
    var finalLink = completeLink;
    finalLink = finalLink.split(' ').join('');

    //set up API-key authenticication
    var options = {
        url: finalLink,
        headers: {
            'x-api-key': 'AWS-PRIVATE-TOKEN'
        }
    };

    if(this.ping == "TRUE") { // if the user wants to use /ping
        var res = request(options, function(error, response, body) {
            console.log("PING REQUEST"); //debug
            body = JSON.parse(body);
            var h_state = body['instanceState'];
            var h_status = body['instanceStatus'];
            this.instance_state = h_state; 
            this.instance_status = h_status;
            console.log("STATE: " + h_state); //debug
            console.log("STATUS: " + h_status); //debug
        });
    }
}

pingFunction () {
    var tmp = "Instance State: " + this.instance_state + " Instance Status: " + this.instance_status;
    return tmp;
} 

}

And here is where I call the api_link() function and pingFunction():

var apiLink1 = new aws_Link("MY_TAG_VALUE", "TRUE", "NULL", "NULL");
var completeAPILink = apiLink1.api_link();
session.send('Request complete.');
session.send("PING: " + apiLink1.pingFunction());

So essentially the user enters in some info which gets passed to where I create the "new aws_Link" which then a my understanding is, creates an object called apiLink1. From there, it makes the request to AWS in my api_link() function, which retrieves the info I want. I thought I was then saving this info when I do the: this.instance_state = h_state; & this.instance_status = h_status;. So then when I call pingFunction() again on apiLink1, I thought I would be able to retrieve the information back out using this.instance_state and this.instance_status, but all it prints out is undefined. Any clarification on why my current code isn't working and any changes or improvements I can make would be greatly appreciated.

Thanks!

Doug Andres
  • 273
  • 3
  • 4
  • 11
  • Possible duplicate of [How do I return the response from an asynchronous call?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Tamas Hegedus Sep 27 '17 at 16:17
  • The request function is asynchronous, meaning that the provided callback will run at a later time, in a subsequent iteration of the global javascript message loop. What happens in your case is simply the ping function runs before the response is recieved and those fields are set. You must see it in the console: the line `Request complete.` shows up before `STATE:` and `STATUS:` – Tamas Hegedus Sep 27 '17 at 16:20

0 Answers0