Personligt har jeg oprettet et separat "fælles" projekt med en init-metode til at registrere alle modellerne med mongodb og kalde init-metoden i app.js-filen for alle apps, der har brug for adgang til modellerne.
- Opret et delt projekt - Opret et nyt nodeprojekt efter standardprocessen.
-
package.json - Indstil din
package.json
i det delte projekt fil til at indeholde følgende post:"main": "index.js"
-
Tilføj en model - Opret en ny
models
mappe i dit delte projekt, for at indeholde alle dine mongoose-skemaer og plugins. Tilføj din userSchema-fil til mappen models, og giv den navnetuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Derefter i projektets rod
index.js
fil opret et delt objekt, der kan bruges af dine apps, eksponerer modellerne og eninit
metode. Der er mange måder at kode dette på, men sådan gør jeg det: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;
- Referer til din
common
projekt - Uanset hvordan du vil referere til dit delte projekt, skal du tilføje referencen til det delte projekt ipackage.json
fil i din app, og giv den et navncommon
. Personligt brugte jeg GitHub til at gemme projektet og refererede til depotstien. Da mit lager var privat, var jeg nødt til at bruge en nøgle i stien, som er dækket på GitHub-supportsiden. -
Indsæt modellerne i din app - I startscriptet til din app (lad os antage, at det er
app.js
for dette eksempel) tilføj referencen til dincommon
projekt og kaldinit
metode til at oprette forbindelse til mongodb-serveren og registrere modellerne.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Brug modellen hvor som helst i din app - Nu hvor mongoose har oprettet forbindelsespuljen, og modellerne er blevet registreret, kan du bruge modellerne i enhver af klasserne i din app. Lad os f.eks. sige, at du har en side, der viser oplysninger om en
user
du kunne gøre det sådan her (utestet kode, skrev lige dette som et eksempel):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}}); }); });
REDIGER Beklager, jeg så ikke linjen, hvor du arvede et skema fra et andet. Som et af de andre svar sagde, tilbyder mongoose allerede konceptet med et plugin
. I dit eksempel ovenfor ville du gøre dette:
I dit fælles modul, under '/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.
}
I dit fælles modul, under '/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);