1

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);
});
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Derooie
  • 121
  • 2
  • 11

3 Answers3

3

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

ben
  • 3,558
  • 1
  • 15
  • 28
  • Thanks for your response, but it doensnt work. Replace the return result with res.json(result) gives me the error undefined is not a function on the res.json line. – Derooie Jun 29 '15 at 18:24
  • Change the `res` variable. You have 2... Try `router.get('/bbq/cyberqData', function (req, routerRes) {` then later `routerRes.json(result)` that should do it – ben Jun 29 '15 at 18:25
  • Thanks, i totally overlooked it! – Derooie Jun 29 '15 at 18:29
2

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);
        });
    }
});
});
Muhammad Umer
  • 17,263
  • 19
  • 97
  • 168
1

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.

Community
  • 1
  • 1
Brennan
  • 1,764
  • 1
  • 14
  • 17