1

私はノードアプリケーションに取り組んでおり、コードを整理するために別のモデルレイヤーで構造化しています。モデルには、Mongojsモジュールを使用してデータベースから情報をフェッチするgetImagesという関数があります。問題は、データが取得される前にgetImagesが返されることです。私は同期コードでの作業に慣れているので、この問題は頭を悩ませることが難しいことを証明しています。答えはどういうわけかコールバック関数を採用することだと思います。誰かがそれがどのように機能するかを示すことができますか?または、コールバックが解決策ではない場合、何ですか?

ルート/index.js

exports.image = function(req, res) {
if (req.method == 'GET') {

    var image = model.getImages();
    return res.send(image);        
}
}

models / index.js

var getImages = function() {

    var imagesCollection = db.collection('Images');

    var images = imagesCollection.find(function(err, docs) {
        return docs;
    });

    return images;
}

exports.getImages = getImages;
4

2 に答える 2

2

関数にコールバックパラメーターを指定する必要がありますgetImages。のように:

ルート/index.js

exports.image = function(req, res) {
    if (req.method == 'GET') {
        model.getImages(function(err, images) {
            return res.send(images);        
        });
    }
}

models / index.js

var getImages = function(callback) {

    var imagesCollection = db.collection('Images');

    imagesCollection.find(callback);
}

exports.getImages = getImages;
于 2012-07-22T02:23:24.053 に答える
0

あなたはimagesCollection.findは非同期関数のようです。oyuが試すことができるコードは次のとおりです。

var getImages = function(callback) {

  var imagesCollection = db.collection('Images');

  imagesCollection.find(function(err, docs) {
     if (err) {
       callback(null);
     } else {
        callback(docs);
     }

  });

}


exports.getImages = getImages;
exports.image = function(req, res) {

 var imageDataFunc = function(imageDataFromDB) {
  if(imageDataFromDB) {
     res.send(imageDataFromDB);
     res.end();
  }

 }

 if (req.method == 'GET') {
   model.getImages(imageDataFunc);        
 }
}
于 2012-07-22T02:29:00.283 に答える