0

Expressフレームワーク内でmongodbクエリを管理するための独自のクラスを作成しています。

これはクラスがどのように見えるか

var PostModel = function(){};

PostModel.prototype.index = function(db){
  db.open(function(err,db){
    if(!err){

      db.collection('post',function(err,collection){

        collection.find().toArray(function(err,posts){
          if(!err){
            db.close();
            return posts;
          }
        });  
      });
    }
  });
};

この関数を呼び出すと:

// GET /post index action
app.get('/post',function(req,res){

  postModel = new PostModel();
  var posts = postModel.index(db);
  res.json(posts); 

});

関数インデックスが何も返さなかったように見える理由がわかりません。

しかし、このようにインデックス関数を変更すると

var PostModel = function(){};

PostModel.prototype.index = function(db){
  db.open(function(err,db){
    if(!err){

      db.collection('post',function(err,collection){

        collection.find().toArray(function(err,posts){
          if(!err){
            db.close();
            console.log(posts);
          }
        });  
      });
    }
  });
};

returnの代わりにconsole.logに注意してください。この変更により、必要なすべての投稿をターミナルで確認できます。これは、関数がすべての投稿を適切に取得するためです。

問題は、投稿が返されないことです:(

4

1 に答える 1

4

非同期関数を使用しています。これらはすべてコールバックを取得するため、コールバックも使用する必要があります。

var PostModel = function(){};

PostModel.prototype.index = function(db, callback){
  db.open(function(err,db){
    if(!err){

      db.collection('post',function(err,collection){

        collection.find().toArray(function(err,posts){
          if(!err){
            db.close();
            callback(posts);
          }
        });  
      });
    }
  });
};
于 2012-07-10T15:22:11.080 に答える