Derooie
Derooie

Reputation: 121

Return data from a http request function

I been looking to some code now to simplify for days. Tried many options, but I am not able to figure it out.

I want to make an http request by a function and then get the data back to use in another function. My issue is that I cant seem to retrieve the data in another function. The console.log works fine.

function getData() {
    request('http://' + address + ':' + port + '/all.xml', function (err, res) {
        if (err) {
            console.log('ERROR: Unable to get CyberQ Data')
        }
        else {
            console.log(res.body);
            return res.body;
        }
    });
}

The below code is my original code. Also works like a charm, expect the most important part, res.json. I like to send the data back to the browser, but the result is not available in the function at the place I added res.json.

If either of these two pieces of code can work, I can make my code working. I probably overlook something basic. Thanks in advance for any help

router.get('/bbq/cyberqData', function (req, res) {
    request('http://' + address + ':' + port + '/all.xml', function (err, res) {
        if (err) {
            console.log('ERROR: Unable to get CyberQ Data')
        }
        else {
            console.log('getting the data ');
            parseString(res.body, function (err, result) {
                console.log(result.nutcallstatus);
                return result;
            });
        }
    });
    res.json(result);
});

Upvotes: 1

Views: 7995

Answers (3)

Muhammad Umer
Muhammad Umer

Reputation: 18097

put the res.json(results) into the callback and fix overlapping of variables.

router.get('/bbq/cyberqData', function (req, res) {
request('http://' + address + ':' + port + '/all.xml', function (err, res1) {
    if (err) {
        console.log('ERROR: Unable to get CyberQ Data')
    }
    else {
        console.log('getting the data ');
        parseString(res1.body, function (err, result) {
            console.log(result.nutcallstatus);
            res.json(result);
        });
    }
});
});

Upvotes: 2

ben
ben

Reputation: 3568

Moving the res.json(result) in place of return result should do it.

Note: you may have to rename your variable. You use 2 times res for 2 different objects

Upvotes: 3

Brennan
Brennan

Reputation: 1785

You need to put the res.json(results) into the callback function.

router.get('/bbq/cyberqData', function (req, res) {
    request('http://' + address + ':' + port + '/all.xml', function (err, res) {
        if (err) {
            console.log('ERROR: Unable to get CyberQ Data')
        }
        else {
            console.log('getting the data ');
            parseString(res.body, function (err, result) {
                console.log(result.nutcallstatus);
                res.json(result);
            });
        }
    });
});

You can read more about the asynchronous nature of javascript here.

Upvotes: 1

Related Questions