Personligen skapade jag ett separat "gemensamt" projekt med en init-metod för att registrera alla modeller med mongodb, och anropa init-metoden i app.js-filen för alla appar som behöver åtkomst till modellerna.
- Skapa ett delat projekt - Skapa ett nytt nodprojekt enligt standardprocessen.
-
package.json - I det delade projektet ställer du in ditt
package.json
fil som innehåller följande post:"main": "index.js"
-
Lägg till en modell - Skapa en ny
models
mapp i ditt delade projekt, för att innehålla alla dina mongoose-scheman och plugins. Lägg till din userSchema-fil i mappen models och döp den tilluser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Sedan i projektets rot
index.js
fil skapa ett delat objekt som kan användas av dina appar, exponera modellerna och eninit
metod. Det finns många sätt att koda detta, men så här gör jag: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;
- Referera till din
common
projekt - Hur du än vill referera till ditt delade projekt, lägg till referensen till det delade projektet ipackage.json
fil i din app och ge den namnetcommon
. Personligen använde jag GitHub för att lagra projektet och refererade till förvarsvägen. Eftersom mitt förråd var privat var jag tvungen att använda en nyckel i sökvägen, som finns på GitHubs supportwebbplats. -
Initiera modellerna i din app - I startskriptet för din app (låt oss anta att det är
app.js
för det här exemplet) lägg till referensen till dincommon
projekt och anropainit
metod för att ansluta till mongodb-servern och registrera modellerna.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Använd modellen var som helst i appen – Nu när mongoose har anslutningspoolen etablerad och modellerna har registrerats kan du använda modellerna i någon av klasserna i din app. Säg till exempel att du har en sida som visar information om en
user
du kan göra det så här (otestad kod, skrev bara detta som ett exempel):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}}); }); });
REDIGERA Förlåt, jag såg inte raden där du ärvde ett schema från ett annat. Som ett av de andra svaren sa erbjuder mongoose redan konceptet med en plugin
. I ditt exempel ovan skulle du göra så här:
I din gemensamma 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 din gemensamma 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);