0

サーバー全体で再利用できるオブジェクトの作成に取り組んでいます。ただし、次の例では、「create」を2回呼び出したように見えます。なぜ何かアイデアはありますか?これをより適切に構成できますか?

var mongo = require('mongodb');
var Server = mongo.Server;
var Db = mongo.Db;
var server = new Server('localhost', 27017, {auto_reconnect: true});

var Database = function(name) {
  this.db = new Db(name, server);
};

Database.prototype.create = function(collection, document, callback) { var db = this.db;

  db.open(function(error, db) {
    if (!error) {
      db.createCollection(collection, function(error, collection) {
        collection.insert(document, {safe: true}, function(error, result) {
          if (error) return callback(error, null);
          return callback(null, result);
        });
      });
    }
    return callback(error, null);
  }); 
};

var data = new Database('foo');
data.create('testing', {'foo': 'bar'}, function(err, result) {
  console.log(result);
});

ファイルを実行すると、次のようになります。

kenneth@apollo:~/Projects/dwibbles$ node db.js 
null
[ { foo: 'bar', _id: 506ba4b0e3441ab82a000001 } ]

なぜこれが2回呼び出されるのですか?

console.log(result);

更新:私が間違った条件を持っていたことが指摘されました。

if (!error) {
  db.createCollection(collection, function(error, collection) {
    collection.insert(document, {safe: true}, function(error, result) {
      if (error) return callback(error, null);
      return callback(null, result);
    });
  });
} else {
  return callback(error, null);
}
4

2 に答える 2

1

以下のコメントで理由を参照してください。

Database.prototype.create = function(collection, document, callback) { 
  var db = this.db;
  db.open(function(error, db) {
    if (!error) {
      db.createCollection(collection, function(error, collection) {
        collection.insert(document, {safe: true}, function(error, result) {
          if (error) return callback(error, null);
          return callback(null, result);
        });
      });
    }
    return callback(error, null); // This line gets executed in the !error case too
  }); 
};

修正するには:

Database.prototype.create = function(collection, document, callback) { 
  var db = this.db;
  db.open(function(error, db) {
    if (!error) {
      db.createCollection(collection, function(error, collection) {
        collection.insert(document, {safe: true}, function(error, result) {
          if (error) return callback(error, null);
          return callback(null, result);
        });
      });
    } else {
      return callback(error, null);
    }
  }); 
};
于 2012-10-03T02:52:11.117 に答える
1

コールバックは実際には2回呼び出されています。

  db.open(function(error, db) {
    if (!error) {
      db.createCollection(collection, function(error, collection) {
        collection.insert(document, {safe: true}, function(error, result) {
          if (error) return callback(error, null);
          return callback(null, result); <-- this one gets called on collection insert
        });
      });
    }
    return callback(error, null); <-- this one gets called immediately after db open
  });

あなたはおそらくこのようなことを意味しました:

  db.open(function(error, db) {
    if (error) {
        return callback(error);
    }

    db.createCollection(collection, function(error, collection) {
      collection.insert(document, {safe: true}, function(error, result) {
        if (error) return callback(error, null);
        return callback(null, result); <-- this one gets called on collection insert
      });
    });

  });
于 2012-10-03T02:53:43.640 に答える