2012-12-02 16 views
5

Ho bisogno di esportare il mio modulo di database mangusta, in modo da poter usare i miei modelli definiti da ogni modulo del mio programma.Esportazione di un modulo di database di mangusta

Per esempio, il mio modulo database.js sembra qualcosa di simile:

var mongoose = require('mongoose'), 
    db = mongoose.createConnection('mongodb://localhost/newdb'), 
    Schema = mongoose.Schema; 

db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    console.log("Connected to database newdb"); 

    var dynamicUserItemSchema = new mongoose.Schema({ 
     userID: Number, 
     rank: Number, 
    }); 

    var staticUserItemSchema = new mongoose.Schema({ 
     _id: Schema.Types.Mixed, 
     type: Schema.Types.Mixed, 
    }); 

    var DynamicUserItem = db.model('DynamicUserItem', dynamicUserItemSchema); 
    var StaticUserItem = db.model('StaticUserItem', staticUserItemSchema); 

}); 

io voglio essere in grado di aggiungere var db = require('../my_modules/database'); a qualsiasi altro modulo il mio programma - così sarò in grado di utilizzare i modelli del genere:

db.DynamicUserItem.find(); o item = new db.DynamicUserItem({});

e 'possibile farlo utilizzando "esportazioni" o "esportazioni modulo"? Grazie.

risposta

19

Io di solito non utilizzare il error e open eventi e segui l'esempio da mongoosejs per creare una connessione al mio db. Usando l'esempio potresti fare quanto segue.

db.js

var mongoose = require('mongoose'); 
var db = mongoose.createConnection('localhost', 'test'); 

var schema = mongoose.Schema({ name: 'string' }); 
var Cat = db.model('Cat', schema); 

module.exports = Cat; // this is what you want 

e poi nelle vostre app.js si può fare qualcosa di simile

var Cat = require('db'); 

var peter = new Cat(); 

Speranza che aiuta!

+0

Grazie zeMirco. così che dice che ogni modello è in un file diverso? – Daniel

+0

dipende da te. È possibile esportare più modelli da un file (ad esempio 'exports.Cat = Cat' e' exports.Dog = Dog') o incollare un modello per file. Per il dopo userei un file di configurazione globale per i parametri di connessione del database. – zemirco

1

Se si utilizza Express, quindi inserirò i modelli in app.settings. Si può fare qualcosa di simile al momento config:

app.configure(function() { 
    app.set('db', { 
     'main'  : db 
    , 'users' : db.model('User') 
    }) 
}) 

Si sarebbe quindi in grado di utilizzare i modelli come req.app.settings.db.users, oppure è possibile creare un modo per ottenere il db var nel file che si desidera in altri modi.

Questa risposta non è un esempio completo, ma date un'occhiata al mio progetto di avviamento che imposta Express e mangusta in un facile da usare modo relativo: https://github.com/mathrawka/node-express-starter

+0

Penso che questo lo fa non aggiungere alcun valore sul sistema di moduli nodo standard/commonjs e associa il codice al sistema di configurazione di Express senza motivo. Basta KISS con i moduli commonjs. –

+0

Sì, lo accoppia con Express e rende più facile accedere a cose comuni come i modelli di mangusta.Per le applicazioni di produzione, a volte i metodi semplici non sono sufficientemente resilienti. – staackuser2

4

È possibile utilizzare le esportazioni per definire un modulo che può essere richiesto altrove:

./models/list.js

var ListSchema = new Schema({ 
    name    : { type: String, required: true, trim: true } 
    , description : { type: String, trim: true } 
}); 

module.exports = db.model('List', ListSchema); 

./routes/list.js

var list = module.exports = {}; 

var List = require('../models/list'); 

list.get = function(req, res){ 
     List.find({ user: user._id }).exec(function(err, lists){ 
      res.render('lists', { 
       lists: lists, 
      }); 
     }); 
    }); 
}; 

./app.js

app.get('lists', routes.lists.get); 
+1

db - dove è definito? è globale? –

1

Come un aggiungendo alla risposta accettata, se si vuole esportare più moduli che si possono fare:

In db.js:

var my_schemas = {'Cat' : Cat, 'Dog': Dog}; 
module.exports = my_schemas; 

Poi negli app.js:

var schemas = require('db'); 
var Cat = schemas.Cat; 
var Dog = schemas.Dog; 
Cat.find({}).exec({...}); 
Problemi correlati