Scaccoman
Scaccoman

Reputation: 465

Javascript/NodeJS: store return value of a function into a variable

I'm trying to store the return value of a function into a variable but it doesn't seem to work. I have tried everything I could possibly think about.. Maybe I'm just doing something really stupid :D I'm running the code in NodeJS using express, request, body-parser and mongoose.

var requestNews = function(){
    request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){
    if (!error && response.statusCode == 200){
        var parsedData = JSON.parse(body);
        var title       =  parsedData.articles[randomNum].title;
        var description =  parsedData.articles[randomNum].description;
        var url         =  parsedData.articles[randomNum].url;
        var urlToImage  =  parsedData.articles[randomNum].urlToImage;
        var publishedAt =  parsedData.articles[randomNum].publishedAt;
        var articleObj  = {
            title: title, 
            description: description, 
            url: url, 
            urlToImage: urlToImage, 
            publishedAt: publishedAt

        };
        articleObjStr = JSON.stringify(articleObj);
        return articleObjStr;
    }
});
};


app.get("/index", function(req, res){
    var randomNew = requestNews();
    console.log(randomNew); // LOGS UNDEFINED
    res.render("index", {randomNew: randomNew});
});

Anyone any ideas?

Thanks for the help!

Upvotes: 1

Views: 8139

Answers (5)

Kavita
Kavita

Reputation: 51

Callback function is not triggered. That's the reason undefined value is getting printed in log.

Upvotes: 0

PRASHANT KUMAR
PRASHANT KUMAR

Reputation: 185

You are trying to get the return value from an asynchronous method, which is not possible. In order to complete your action, you can do following:

app.get("/index", function(req, res){
     requestNews(req, res);
});

var requestNews = function(req, res){
request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){
if (!error && response.statusCode == 200){
    var parsedData = JSON.parse(body);
    var title       =  parsedData.articles[randomNum].title;
    var description =  parsedData.articles[randomNum].description;
    var url         =  parsedData.articles[randomNum].url;
    var urlToImage  =  parsedData.articles[randomNum].urlToImage;
    var publishedAt =  parsedData.articles[randomNum].publishedAt;
    var articleObj  = {
        title: title, 
        description: description, 
        url: url, 
        urlToImage: urlToImage, 
        publishedAt: publishedAt

    };
    articleObjStr = JSON.stringify(articleObj);
   // return articleObjStr; do not return value from here it can not be retrived
   res.render("index", {randomNew: articleObjStr});
   }
  });
};

Upvotes: 1

Francisco Mercedes
Francisco Mercedes

Reputation: 107

requestNews function is not returning nothing.

var requestNews = function(){

      // Missing return Here.
      return request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){

      // All you code here.    
      return articleObjStr;
    }
  });
};

The problem is that you are retuning a value in the function that you pass to the request method, and if this is a call back, it also will not work.

If is a call back do it in this way:

var requestNews = function(onNewsRetrived){ // Use a callback here
          request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){

      onNewsRetrived(articleObjStr); // Trigger your call back get you got the info.
    }
  });
};

app.get("/index", function(req, res){
   requestNews(funtion(randomNew) {

    console.log(randomNew); // Should Work
    res.render("index", {randomNew: randomNew});

   });       
});

Upvotes: 0

Sigma
Sigma

Reputation: 542

Use a callback :

var requestNews = function(callback){
    request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){
    if (!error && response.statusCode == 200){
        var parsedData = JSON.parse(body);
        var title       =  parsedData.articles[randomNum].title;
        var description =  parsedData.articles[randomNum].description;
        var url         =  parsedData.articles[randomNum].url;
        var urlToImage  =  parsedData.articles[randomNum].urlToImage;
        var publishedAt =  parsedData.articles[randomNum].publishedAt;
        var articleObj  = {
            title: title, 
            description: description, 
            url: url, 
            urlToImage: urlToImage, 
            publishedAt: publishedAt

        };
        articleObjStr = JSON.stringify(articleObj);
        return callback(null, articleObjStr);
    } else {
      return callback(error);
    }
});
};


app.get("/index", function(req, res){
    requestNews(function(err, data){
      if(err) console.log(err);
      else {
        var randomNew = data;
        console.log(randomNew); // LOGS UNDEFINED
        res.render("index", {randomNew: randomNew});
      }
    });

});

Upvotes: 2

Kukic Vladimir
Kukic Vladimir

Reputation: 1010

request is async operation and you can not assign value like that. You can use callback or promise.

Here is a snippet code on how can you achieve this using callbacks

var requestNews = function(callback){
  request("https://newsapi.org/v1/articles?source=google-news&sortBy=top&apiKey=2cc11b1813c942*************", function(error, response, body){
    if (!error && response.statusCode == 200){
      var parsedData = JSON.parse(body);
      var title       =  parsedData.articles[randomNum].title;
      var description =  parsedData.articles[randomNum].description;
      var url         =  parsedData.articles[randomNum].url;
      var urlToImage  =  parsedData.articles[randomNum].urlToImage;
      var publishedAt =  parsedData.articles[randomNum].publishedAt;
      var articleObj  = {
        title: title, 
        description: description, 
        url: url, 
        urlToImage: urlToImage, 
        publishedAt: publishedAt

      };
      articleObjStr = JSON.stringify(articleObj);
      callback(null, articleObjStr);
    } else {
      callback(error)
    }
  });
};


app.get("/index", function(req, res, next){
  requestNews(function(err, data) {
    if (err) return next(err);
    console.log(data);
    res.render("index", {randomNew: data});
  });

});

Upvotes: 4

Related Questions