Reputation: 465
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
Reputation: 51
Callback function is not triggered. That's the reason undefined value is getting printed in log.
Upvotes: 0
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
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
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
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