Reputation: 181
I'm writing a function and I want to be able to return my Mongoose query data, so I can use it. However, I can only access sum within the .exec function. How do I get it outside so it gets returned when the functions called?
function get_likes(user){
var Image = require('./models/image');
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
if (err) return console.error(err);
var sum = 0;
for(var i=0;i<collected.length-1;i++){
sum += collected[i].like_count;
}
// I CAN PRINT SUM HERE
console.log(sum);
return sum;
});
// SUM DOESN'T EXIST OUT HERE.
return sum;
}
Upvotes: 1
Views: 913
Reputation: 768
use callback function to respond
function get_likes(user, cb){
var Image = require('./models/image')
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
if (err) return console.error(err);
var sum = 0;
for(var i=0;i<collected.length-1;i++){
sum += collected[i].like_count;
}
// I CAN PRINT SUM HERE
console.log(sum);
cb(sum);
});
}
or if you are using it as an api you can use res.send({"sum": sum});
function get_likes(user, req, res){
var Image = require('./models/image');
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
if (err) return res.status(400).send({"error":"unable to connect"});
var sum=0;
for(var i=0;i<collected.length-1;i++){
sum += collected[i].like_count;
}
// I CAN PRINT SUM HERE
console.log(sum);
res.status(200).send({"sum": sum});
});
}
I took node/express as example server.
Upvotes: 1
Reputation: 1688
Your get_likes function is asynchronous so you're supposed to have a callback
function get_likes(user, callback){
var Image = require('./models/image');
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
if (err) return callback(err);
var sum = 0;
for(var i=0;i<collected.length-1;i++){
sum += collected[i].like_count;
}
// I CAN PRINT SUM HERE
console.log(sum);
callback(null, sum);
});
}
Upvotes: 0
Reputation: 36319
You can't directly. node.js uses callbacks and events to handle its asynchronous operations. Your best bet is to embrace that.
You can indirectly do this by adopting a promise library (http://howtonode.org/promises) but that only kind of fakes synchronous operations.
Upvotes: 1