2012-03-13 10 views
22

Używam Mongoose do zarządzania bazą danych Mongo. Mój plik gra jest dość prosta:Najlepszy sposób udostępniania parametrów połączenia z bazą danych za pomocą mangusta/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 

Następnie w moich app.js Właśnie

require('./database) 

i zmienna "Mangusta" jest dostępna globalnie. Wolałbym nie używać globali (przynajmniej nie bezpośrednio). Czy istnieje lepszy sposób udostępniania zmiennej połączenia z bazą danych w węźle (korzystam z pliku express.js) za pomocą wzorca singleton lub innej metody?

+0

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

Odpowiedz

29

I po prostu wykonaj następujące czynności w pliku 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. 

W tym momencie każdy plik, który potrzebuje dostępu do tego modelu można zrobić:

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

i wreszcie w modelu, można mieć plik napisany normalnie następnie wyeksportować go na dole:

module.exports.YourModelName = YourModelName; 

Nie wiem, czy to najlepsze, najbardziej niesamowite rozwiązanie (po prostu zaczęłam owijać głowę wokół eksportu modułów około 2 dni temu), ale działa. Może ktoś może komentować, jeśli jest to dobry sposób na zrobienie tego.

+0

oh, ok, więc nie potrzebuję zmiennej globalnej wskazującej na "mangusta", ponieważ mogę wymagać, kiedy jej potrzebuję. – typeoneerror

+0

Tak, również o ile wiem ekspresowy, buforowane są moduły, które ładujesz. Więc raz załadowana mangusta, nie jest tak, jak ekspresowa będzie nadal przeładowywała od zera dla każdego wymagania. Byłoby fajnie, gdyby ktoś mógł to potwierdzić, ale jestem pewien, że przeczytałem to gdzieś w przeszłości. – AntelopeSalad

+0

Nie wiem o ekspresowym buforowaniu, ale wiem, że wymaga buforowania modułów, które ładuje. –

6

jeśli się commonjs eksport

exports.mongoose = mongoose 

załóżmy, że nazwa modułu jest connection.js

można wymagać

var mongoose = require('connection.js') 

można użyć połączenia Mongoose

2

I ogólnie owinąć moje modele jak ten

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

I w moim głównej klasy, robię to var schema = require('./schema.js').Schema; i nazywają conn.model(schema.GetIdentifier(), schema.GetSchema()) i oczywiście po wywołaniu połączyć, lub createConnection. To pozwala mi wtyczkować schemat do standardowego zestawu metod. To uogólnienie jest dobre, ponieważ możesz skoncentrować się na swoim schemacie po opanowaniu połączenia i obsługi błędów. Rozszerzam również schemat o wtyczki i to pozwala mi udostępniać wtyczki innym schematom.

Chciałem sprawdzić, czy jakieś ciało zrobiło to lepiej, ale nie widzę dobrego wzoru, a ja jestem całkiem nowy w Mongo.

Mam nadzieję, że to pomoże.

Powiązane problemy