Conexión de controlador nativo Mongodb Node.js

main.js

var http = require('http'); var UserModel = require('./models/user.js'); var server = http.createServer(function(req, res){ UserModel.create({ }), function(e, o){ if(e) { console.log(e); } else { } console.log(o); } }); }).listen(3000); 

conexiones.js

 var mongo = require('mongodb'); module.exports = { dbMain: new mongo.Db('main', new mongo.Server('127.0.0.1', 27017, { auto_reconnect: true }, {})), dbLog: new mongo.Db('log', new mongo.Server('127.0.0.1', 27017, { auto_reconnect: true }, {})) }; 

/modelos/usuario.js

 var mongodb = require('mongodb'); var db = require('./connections.js').dbMain; module.exports = { create: function(newData, callback){ db.open(function(e, db){ db.collection('users', function(e, collection){ collection.insert(newData, callback); }); }); } } 

Cuando uso el código anterior, el servidor falla con el problema de que, la SEGUNDA vez que llega una solicitud, todavía tenemos la conexión de la base de datos abierta, así que agreguemos db.close a nuestra función Users.create.

  create: function(newData, callback){ db.open(function(e, db){ db.collection('users', function(e, collection){ collection.insert(newData, function(e, o){ db.close(); // Voila. callback(e, o); }); }); }); } 

En esta etapa, el servidor todavía puede fallar, debido a que se han abierto varias conexiones, no entiendo por qué o cómo puede suceder esto, pero sucede.

¿Cómo organizo mi proyecto en modelos (no quiero usar Mongoose, mi validación se realiza en una capa diferente, no en el modelo, por lo que Mongoose sería una exageración para mí)? Además, ¿cómo manejo las conexiones en el proyecto?

podría tener una biblioteca que envuelva todo esto muy bien; esto significa que solo se abrirá una conexión a la base de datos y se devolverá la misma conexión (abierta) para la segunda solicitud: si obtiene 1000+ por segundo, esto es un problema de establecimiento o interrupción (es decir, no volver a abrir la conexión cada solicitud) …

usuarios.js :

 var connections = require('./connections.js'); var serverCache = connections('127.0.0.1', 27017); module.exports = { create: function(newData, callback){ serverCache('main', 'users', function(e, collection){ collection.insert(newData, callback); }) } } 

conexiones.js

 var mongo = require('mongodb'); // a mongo connection cache // pass in host & port // it returns a function accepting dbName, collectionName & callback var mongoCache = function(host, port){ // keep our open connections var mongoDatabases = {}; var ensureDatabase = function(dbName, readyCallback){ // check if we already have this db connection open if(mongoDatabases[dbName]){ readyCallback(null, mongoDatabases[dbName]); return; } // get the connection var server = new mongo.Server(host, port, {auto_reconnect: true}); // get a handle on the database var db = new mongo.Db(dbName, server); db.open(function(error, databaseConnection){ if(error) throw error; // add the database to the cache mongoDatabases[dbName] = databaseConnection; // remove the database from the cache if it closes databaseConnection.on('close', function(){ delete(mongoDatabases[dbName]); }) // return the database connection readyCallback(error, databaseConnection); }) } var ensureCollection = function(dbName, collectionName, readyCallback){ ensureDatabase(dbName, function(error, databaseConnection){ if(error) throw error; databaseConnection.createCollection(collectionName, function(error, collection) { if(error) throw error; // return the collection finally readyCallback(error, collection); }) }) } return ensureCollection; } module.exports = mongoCache; 

Actualmente estoy usando una conexión global con múltiples solicitudes de http. En el pasado, creé una biblioteca compleja que creaba varias conexiones a MongoDB y elegía una al azar para cada conexión.

Más tarde descubrí que el controlador nativo puede hacer eso por mí, lo cual es bastante bueno. Actualmente estoy usando un solo objeto, y el controlador elige a qué conexión enviar la consulta.

 var srvOpts = { auto_reconnect: true, poolSize: 10, }; var conn = new Mongo.Server("localhost", 27017, srvOpts), db = new Mongo.Db("dbname", conn, {}); db.open(function (){}); 

Como puedes, esta es una gran idea, estoy pensando en copiar esa idea en el controlador Redis que estoy usando, pero tengo poco tiempo, así que dudo que lo haga en el futuro.