2017-03-27 7 views
0

mongo dbを照会して結果を返し、ページ上にレンダリングする関数を作成しようとしています。関数はmongodbから取り出されたオブジェクトを返さない

私は現在、これが動作しない理由を見つけるためにオブジェクトを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を返します。何が起きてる?私はそれが非同期コールバックと関係があると感じていますが、私はそれについて推論することはできません。

ありがとうございます。

+0

約束で 'getMarkets'をラップし、それは' getMarkets' –

+1

@DarrenSweeneyの成功から、ルータ機能を解決するか、コールするのを待つのどちらか本当にやった約束トリック、今日何かを学ぶのを助けてくれてありがとう! –

答えて

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

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

約束を使用することもできます。