函数不返回从mongodb检索的对象

时间:2017-03-27 08:18:44

标签: javascript mongodb

我试图创建一个函数来查询mongo db然后返回结果,然后在页面上呈现它。

我目前正在尝试使用console.log查找对象以找出原因无效:

var getMarkets = function (marketID) {
  MongoClient.connect('mongodb://localhost:27017/test', function(err, db){
    db.collection("new-test-2", function (err, collection) {
      collection.find({"ID": parseInt(marketID, 10)}).toArray(function(err, items) {
        console.log(items);
        return items;
      });
    });
  });
};
router.get('/markets/:marketid', function(req, res, next) {
  var marketobj = getMarkets(req.params.marketid);
  console.log(marketobj);
  res.render('api', { title: 'API', marketid: marketobj });
});

嵌套在函数内的日志工作正常,但是路由对象内的日志返回undefined。这里发生了什么?我觉得它与异步回调有关,但我无法推理它。

非常感谢。

2 个答案:

答案 0 :(得分:0)

Mongodb连接和查找操作是异步函数。所以你需要使用回调来返回结果。只是返回里面的功能不起作用。

var getMarkets = function (marketID, callback) {
  MongoClient.connect('mongodb://localhost:27017/test', function(err, db){
    db.collection("new-test-2", function (err, collection) {
      collection.find({"ID": parseInt(marketID, 10)}).toArray(function(err, items) {
        if(err)
          callback(err)
        else {
          console.log(items);
          callback(null,items);
        }
      });
    });
  });
};
router.get('/markets/:marketid', function(req, res, next) {
  getMarkets(req.params.marketid, function (err, marketobj) {
    console.log(marketobj);
    res.render('api', { title: 'API', marketid: marketobj });
  });
});

你也可以使用承诺。

答案 1 :(得分:0)

使用回调功能访问数据

    var getMarkets = function (marketID , callback) {
    MongoClient.connect('mongodb://localhost:27017/test', function(err, db){
        db.collection("new-test-2", function (err, collection) {
            collection.find({"ID": parseInt(marketID, 10)}).toArray(function(err, items) {
                console.log(items);
                //return callback
                return callback(items);
            });
        });
    });
};
router.get('/markets/:marketid', function(req, res, next) {
    getMarkets(req.params.marketid , function(marketobj){
        if(marketobj){

            console.log(marketobj);
            res.render('api', { title: 'API', marketid: marketobj });

        }else{
            // do whatever you want

            res.render('api', { title: 'API', marketid: {} });
        }
    });

});