Gregory Worrall
Gregory Worrall

Reputation: 181

Returning data in function outside Mongoose

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

Answers (3)

Pradeep Potnuru
Pradeep Potnuru

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

Christian Saiki
Christian Saiki

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

Paul
Paul

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

Related Questions