Osobiście stworzyłem osobny "wspólny" projekt z metodą init, aby zarejestrować wszystkie modele za pomocą mongodb i wywołać metodę init w pliku app.js każdej aplikacji, która potrzebuje dostępu do modeli.
- Utwórz wspólny projekt - Utwórz nowy projekt węzła zgodnie ze standardowym procesem.
-
package.json - We wspólnym projekcie ustaw swój
package.json
plik zawierający następujący wpis:"main": "index.js"
-
Dodaj model - Utwórz nowe
models
folder w ramach współdzielonego projektu, aby zawierał wszystkie schematy i wtyczki mongoose. Dodaj plik userSchema do folderu modeli i nazwij gouser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Następnie w katalogu głównym projektu
index.js
plik utwórz współdzielony obiekt, który może być używany przez twoje aplikacje, odsłaniając modele iinit
metoda. Jest wiele sposobów na zakodowanie tego, ale oto jak to robię:function Common() { //empty array to hold mongoose Schemas this.models = {}; } Common.prototype.init = function(mongoose) { mongoose.connect('your mongodb connection string goes here'); require('./models/user'); //add more model references here //This is just to make referencing the models easier within your apps, so you don't have to use strings. The model name you use here must match the name you used in the schema file this.models = { user: mongoose.model('User') } } var common = new Common(); module.exports = common;
- Odwołaj się do
common
projekt - Jakkolwiek chcesz odwołać się do współdzielonego projektu, dodaj odwołanie do współdzielonego projektu wpackage.json
plik w Twojej aplikacji i nadaj mu nazwęcommon
. Osobiście użyłem GitHub do przechowywania projektu i odwoływałem się do ścieżki repozytorium. Ponieważ moje repozytorium było prywatne, musiałem użyć klucza w ścieżce, która jest opisana na stronie wsparcia GitHub. -
Uruchom modele w swojej aplikacji - W skrypcie startowym Twojej aplikacji (załóżmy, że jest to
app.js
dla tego przykładu) dodaj odwołanie do swojegocommon
projektu i wywołajinit
metoda połączenia z serwerem mongodb i zarejestrowania modeli.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Użyj modelu w dowolnym miejscu w aplikacji - Teraz, gdy mangusta ma ustanowioną pulę połączeń i modele zostały zarejestrowane, możesz używać modeli w dowolnej klasie w swojej aplikacji. Załóżmy na przykład, że masz stronę wyświetlającą informacje o
user
możesz to zrobić w ten sposób (nieprzetestowany kod, po prostu napisałem to jako przykład):var common = require('common'); app.get('/user-profile/:id', function(req, res) { common.models.user.findById(req.params.id, function(err, user) { if (err) console.log(err.message); //do something else to handle the error else res.render('user-profile', {model: {user: user}}); }); });
EDYTUJ Przepraszamy, nie widziałem wiersza, w którym dziedziczyłeś jeden schemat po drugim. Jak podano w jednej z innych odpowiedzi, mangusta już oferuje koncepcję plugin
. W powyższym przykładzie zrobiłbyś to:
W Twoim wspólnym module, pod '/models/base-profile-plugin.js'
module.exports = exports = function baseProfilePlugin(schema, options){
//These paths will be added to any schema that uses this plugin
schema.add({
_user: {type: Schema.Types.ObjectId, ref: 'User', required: true},
name: {type: String, required: true},
bio: {type: String, required: true},
pictureLink: String
});
//you can also add static or instance methods or shared getter/setter handling logic here. See the plugin documentation on the mongoose website.
}
We wspólnym module, pod '/models/entrepreneur.js
var mongoose = require('mongoose')
, basePlugin = require('./base-profile-plugin.js');
var entrepreneurSchema = new mongoose.Schema({
mentors: {type: Schema.Types.ObjectId, ref: 'Mentor'}
});
entrepreneurSchema.plugin(basePlugin);
module.exports = mongoose.model('Entrepreneur', entrepreneurSchema);