2012-12-02 82 views
5

我需要導出我的貓鼬數據庫模塊,所以我可以使用我的程序中的每個模塊定義的模型。導出貓鼬數據庫模塊

例如,我database.js模塊看起來就像這樣:

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

}); 

我希望能夠加入var db = require('../my_modules/database');到其它模塊我的計劃 - 所以我將能夠使用這些模型這樣的:

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

是否有可能這樣做,使用「出口」或「模塊出口」?謝謝。

回答

19

我通常不使用erroropen事件並按照mongoosejs中的示例創建到我的數據庫的連接。使用這個例子,你可以做到以下幾點。

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 

,然後在app.js,你可以這樣做

var Cat = require('db'); 

var peter = new Cat(); 

希望幫助!

+0

謝謝zeMirco。所以說每個模型都在一個不同的文件中? – Daniel

+0

這取決於你。您可以從一個文件中導出多個模型(例如'exports.Cat = Cat'和'exports.Dog = Dog'),或者爲每個文件保留一個模型。對於後面的我會使用全局配置文件作爲數據庫連接參數。 – zemirco

1

如果你使用快遞,那麼我會把模型放在app.settings中。你可以在配置的時間做這樣的事情:

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

你會那麼能夠使用的車型,如req.app.settings.db.users,或者你可以創建一個辦法讓你在其他方面想在文件中db變種。

這個答案不完整的例子,但看看我的啓動項目,設置了快遞和貓鼬在相對容易使用的方式:https://github.com/mathrawka/node-express-starter

+0

我覺得這確實不要在標準節點/ commonjs模塊系統上添加任何值,並且無故將您的代碼與express的配置系統耦合。只需與commonjs模塊吻合。 –

+0

是的,它將它與express結合在一起,使它更容易訪問像貓鼬模型這樣的常見事物。對於生產應用程序,有時簡單的方法不夠靈活。 – staackuser2

4

你可以用出口來定義可以在其他地方需要的模塊:

./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 - 在哪裏定義?它是全球性的嗎? –

1

As加法到接受的答案,如果你要導出多個模塊,你可以這樣做:

在db.js:

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

然後在app.js:

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