2012-03-13 14 views
22

Estoy usando Mongoose para administrar una base de datos de Mongo. Mi archivo de conexión es bastante simple:La mejor manera de compartir param de conexión de base de datos con mongoose/node.js

var mongoose = require('mongoose') 

mongoose.connection.on("open", function(){ 
    console.log("Connection opened to mongodb at %s", config.db.uri) 
}); 
console.log("Connecting to %s", config.db.uri) 
mongoose.connect(config.db.uri) 

global.mongoose = mongoose 

Luego, en mis app.js acabo

require('./database) 

y la variable "mangosta" está disponible a nivel mundial. Prefiero no usar globales (al menos no directamente). ¿Hay una mejor manera de compartir la variable de conexión de la base de datos a través del nodo (estoy usando express.js) a través de un patrón singleton o algún otro método?

+0

Mayby duplica esto http://stackoverflow.com/questions/9651066/how-can-i-structure-my-express-app-where-i-only-need-to-open-a-mongodb-connectio/ 9653519 # 9653519 –

Respuesta

29

I solo haga lo siguiente en mi archivo app.js:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://address_to_host:port/db_name'); 
modelSchema = require('./models/yourmodelname').YourModelName; 
mongoose.model('YourModelName', modelSchema); 
// TODO: write the mongoose.model(...) command for any other models you have. 

En este punto, cualquier archivo que necesita acceso a ese modelo se puede hacer:

var mongoose = require('mongoose'); 
YourModelName = mongoose.model('YourModelName'); 

Y, finalmente, en su modelo, puede tener el archivo escrito normalmente después exportar al fondo:

module.exports.YourModelName = YourModelName; 

No sé si esta es la mejor solución (simplemente comencé a dar vueltas a los módulos de exportación hace unos dos días) pero funciona. Tal vez alguien pueda comentar si esta es una buena manera de hacerlo.

+0

oh, vale, entonces no necesito una variable global que apunte a "mangosta" porque puedo requerirla cuando la necesito. – typeoneerror

+0

Sí, también, por lo que sé, los módulos de memoria caché que cargue. Así que una vez que la mangosta se cargue una vez, no es como expresar seguirá recargándola desde cero para cada requerimiento. Sería genial si alguien puede confirmarlo con certeza, pero estoy bastante seguro de que lo leí en algún lugar del pasado. – AntelopeSalad

+0

No sé sobre el almacenamiento en caché rápido, pero sé que requiere almacenar en caché los módulos que carga. –

6

si sigue CommonJS exportaciones

exports.mongoose = mongoose 

digamos su nombre de módulo es connection.js

puede requerir

var mongoose = require('connection.js') 

puede utilizar la conexión mangosta

2

lo general envolver mis modelos como éste

var MySchema = (function(){ 
//Other schema stuff 

//Public methods 
GetIdentifier = function() { 
return Id; 
}; 

GetSchema = function() { 
return UserSchema; 
}; 

return this; 
})(); 

if (typeof module !== 'undefined' && module.exports) { 
exports.Schema = MySchema; 
} 

Y en mi clase principal, hago esto var schema = require('./schema.js').Schema; y llamar conn.model(schema.GetIdentifier(), schema.GetSchema()) y por supuesto después de llamar a conectar, o CreateConnection. Esto me permite agregar el esquema al conjunto estándar de métodos. Esta generalización es buena porque puede concentrarse en su esquema después de dominar la conexión y el manejo de errores. También extiendo el esquema con complementos, y eso me permite compartir complementos con otros esquemas.

Estaba buscando ver si algún cuerpo lo ha hecho mejor, pero no puedo ver para encontrar un buen patrón, y soy bastante nuevo en Mongo.

Espero que esto ayude.

Cuestiones relacionadas