Reputation: 869
I'm working on creating an object that I can reuse throughout my server. However, with the following example, I get, what appears to be two calls to 'create'. Any ideas why? Can I structure this better.
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);
});
Running the file results in:
kenneth@apollo:~/Projects/dwibbles$ node db.js
null
[ { foo: 'bar', _id: 506ba4b0e3441ab82a000001 } ]
Why is this being called twice?
console.log(result);
UPDATE: It was pointed out that I had an incorrect conditional.
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);
}
Upvotes: 0
Views: 380
Reputation: 25555
Your callback is actually being called twice:
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
});
You probably meant something like this:
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
});
});
});
Upvotes: 1
Reputation: 311895
See reason in the comment below:
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
});
};
To fix:
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);
}
});
};
Upvotes: 1