2015-06-29 1 views
0

Я искал некоторый код, который теперь упрощается в течение нескольких дней. Пробовал много вариантов, но я не могу понять это.Возврат данных из функции http-запроса

Я хочу сделать http-запрос функцией, а затем вернуть данные для использования в другой функции. Моя проблема в том, что я не могу получить данные в другой функции. Консоль.log работает отлично.

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; 
     } 
    }); 
} 

Приведенный ниже код - это мой первоначальный код. Также работает как прелесть, ожидайте самую важную роль, res.json. Мне нравится отправлять данные обратно в браузер, но результат недоступен в функции в месте, где я добавил res.json.

Если любой из этих двух частей кода может работать, я могу заставить мой код работать. Я, вероятно, не замечаю ничего общего. Заранее спасибо за любую помощь

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); 
}); 

ответ

3

Перемещение res.json(result) вместо return result должно это сделать.

Примечание: вам может потребоваться переименовать переменную. Вы используете 2 раза res для 2-х разных объектов

+0

Спасибо за ваш ответ, но он не работает. Заменить результат возврата с помощью res.json (result), дает мне ошибку undefined, не является функцией на линии res.json. – Derooie

+0

Измените переменную 'res'. У вас есть 2 ... Попробуйте 'router.get ('/ bbq/cyberqData', function (req, routerRes) {' then later 'routerRes.json (result)' , который должен это сделать – ben

+0

Спасибо, я полностью его игнорировал! – Derooie

1

Вы должны поместить res.json(results) в функцию обратного вызова.

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); 
      }); 
     } 
    }); 
}); 

Вы можете прочитать больше о асинхронной природы JavaScript here.

+0

Спасибо, за ссылку. Хорошее чтение – Derooie

2

введите res.json(results) в обратный вызов и зафиксируйте перекрытие переменных.

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); 
     }); 
    } 
}); 
}); 
+0

Да, действительно, это так. Спасибо. – Derooie