Persoonlijk heb ik een apart "algemeen" project gemaakt met een init-methode om alle modellen bij mongodb te registreren en de init-methode aan te roepen in het app.js-bestand van alle apps die toegang tot de modellen nodig hebben.
- Maak een gedeeld project - Maak een nieuw knooppuntproject volgens het standaardproces.
-
pakket.json - Stel in het gedeelde project uw
package.json
. in bestand om de volgende invoer te bevatten:"main": "index.js"
-
Een model toevoegen - Maak een nieuwe
models
map binnen uw gedeelde project, om al uw mangoestschema's en plug-ins te bevatten. Voeg uw userSchema-bestand toe aan de map modellen en noem hetuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Dan in de hoofdmap van het project
index.js
bestand maak een gedeeld object dat door uw apps kan worden gebruikt, waarbij de modellen en eeninit
worden weergegeven methode. Er zijn veel manieren om dit te coderen, maar hier is hoe ik het doe: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;
- Verwijs naar uw
common
project - Hoe u ook naar uw gedeelde project wilt verwijzen, voeg de verwijzing naar het gedeelde project toe in depackage.json
bestand in uw app en geef het de naamcommon
. Persoonlijk gebruikte ik GitHub om het project op te slaan en verwees ik naar het repositorypad. Omdat mijn repository privé was, moest ik een sleutel gebruiken in het pad, dat wordt beschreven op de GitHub-ondersteuningssite. -
Start de modellen in uw app - In het startscript voor uw app (laten we aannemen dat het
app.js
is voor dit voorbeeld) voeg de verwijzing toe aan uwcommon
project en roep deinit
methode om verbinding te maken met de mongodb-server en de modellen te registreren.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Gebruik het model overal in uw app - Nu mangoest de verbindingspool tot stand heeft gebracht en de modellen zijn geregistreerd, kunt u de modellen gebruiken in elk van de klassen binnen uw app. Stel bijvoorbeeld dat u een pagina heeft die informatie weergeeft over een
user
je zou het als volgt kunnen doen (ongeteste code, heb dit alleen als voorbeeld geschreven):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}}); }); });
BEWERKEN Sorry, ik heb de regel niet gezien waarin je het ene schema van het andere overnam. Zoals een van de andere antwoorden al zei, biedt mangoest al het concept van een plugin
. In uw voorbeeld hierboven zou u dit doen:
In uw algemene module, onder '/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.
}
In uw algemene module, onder '/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);