Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用node.js的mongodb本机绑定构造数据库对象_Javascript_Node.js_Mongodb_Node Mongodb Native_Nosql - Fatal编程技术网

Javascript 使用node.js的mongodb本机绑定构造数据库对象

Javascript 使用node.js的mongodb本机绑定构造数据库对象,javascript,node.js,mongodb,node-mongodb-native,nosql,Javascript,Node.js,Mongodb,Node Mongodb Native,Nosql,我正在创建一个可以在整个服务器中重用的对象。然而,在下面的例子中,我得到了两个调用“create”的结果。你知道为什么吗?我能把这个组织得更好吗 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)

我正在创建一个可以在整个服务器中重用的对象。然而,在下面的例子中,我得到了两个调用“create”的结果。你知道为什么吗?我能把这个组织得更好吗

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 } ]
为什么要叫两次

控制台日志(结果)

更新: 有人指出我的条件错误

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

请参见下面评论中的原因:

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

您的回调实际上被调用了两次:

  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(函数(错误,db){
如果(!错误){
db.createCollection(集合,函数(错误,集合){
insert(文档,{safe:true},函数(错误,结果){
if(error)返回回调(error,null);

返回回调(null,result);嘎!是的,这就是我的本意。我真傻。谢谢你的回答!
  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
      });
    });

  });