在Mongoose之外的函数中返回数据

时间:2016-01-06 19:31:58

标签: javascript node.js mongodb mongoose

我正在编写一个函数,我希望能够返回我的Mongoose查询数据,所以我可以使用它。但是,我只能访问.exec函数中的sum。如何在外部获取它,以便在函数调用时返回?

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;
}

3 个答案:

答案 0 :(得分:1)

你不能直接。 node.js使用回调和事件来处理其异步操作。你最好的选择是拥抱它。

您可以通过采用promise库(http://howtonode.org/promises)间接执行此操作,但这只是伪造同步操作。

答案 1 :(得分:0)

使用回调函数进行回复

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);
    });

}

或者如果你将它用作api,你可以使用res.send({&#34; sum&#34;: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});
        });

    }

我将node / express作为示例服务器。

答案 2 :(得分:0)

你的get_likes函数是异步的,所以你应该有一个回调

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);
});
}