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.jsonplik zawierający następujący wpis:"main": "index.js" -
Dodaj model - Utwórz nowe
modelsfolder 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.jsplik utwórz współdzielony obiekt, który może być używany przez twoje aplikacje, odsłaniając modele iinitmetoda. 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
commonprojekt - Jakkolwiek chcesz odwołać się do współdzielonego projektu, dodaj odwołanie do współdzielonego projektu wpackage.jsonplik 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.jsdla tego przykładu) dodaj odwołanie do swojegocommonprojektu i wywołajinitmetoda 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
usermoż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);