2016-02-25 4 views
1

Я пытаюсь получить ответ JSON через метод запроса и возвращать вывод, чтобы я мог хранить его в переменной при вызове функции. когда я регистрирую ответ в методе запроса, он работает нормально. Однако, когда я возвращаю вывод, он не возвращается.Невозможно вернуть тело метода запроса в nodejs

var getAPIresponse = function(url) { 
    var request = require('request'); 
    request(url, function(error, response, body) { 
     if(!error && response.statusCode == 200) { 
      console.log(body); // WORKS PERFECTLY 
      return body;  // I Believe the issue is here 
     } else { 
      console.log("Error: "+ error); 
     } 
    }); 
}; 

router.get('/', function (req, res) { 
    var poolList = getAPIresponse("www.addAURL"); 

    console.log(poolList); // DOESN'T WORK. REPORTS AS UNDEFINED 
    res.render('index', model); // THIS IS JUST SAYS HELLO WORLD 
}); 
+1

[Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) Вы не может. Когда 'request()' является асинхронным, 'getAPIresponse()' фактически завершает свое выполнение, возвращая 'undefined' в' poolList', перед вызовом callback и 'body'. –

ответ

0

Что ваш метод на самом деле выполняется следующие две строки

var request = require('request'); 
request(url, function(error, response, body) { 

... а затем выпадают из функции сразу после чего ваш вызывающий код получает неопределенными назад. Обратный вызов не вызывается до тех пор, пока запрос не будет выполнен, что может быть намного позже.

Чтобы заставить его работать, ваша функция также требует обратного вызова, который вызывается, когда функция фактически завершена, что-то вроде;

var getAPIresponse = function(url, cb) { 
    var request = require('request'); 
    request(url, function(error, response, body) { 
     if(!error && response.statusCode == 200) { 
      console.log(body); // WORKS PERFECTLY 
     } else { 
      console.log("Error: "+ error); 
     } 
     cb(error, body); 
    }); 
}; 

router.get('/', function (req, res) { 

    var poolList = getAPIresponse("www.addAURL", function(err, poolList) { 

     // This is run in a callback once the request is done.  
     console.log(poolList); 
     res.render('index', model); 

    }); 
}); 

Другим способом было бы использовать promises, который может очистить код несколько, когда число обратных вызовов выходит из-под контроля.

+0

Ahh полностью проскользнул из-за асинхронного бита. Спасибо, что помогли мне. –

+0

@the_lost_one Если ответ помог, вы можете пометить его как ответ на свой вопрос. Это поможет другим с подобными вопросами найти ответы. –

Смежные вопросы