Лично аз създадох отделен „общ“ проект с init метод за регистриране на всички модели с mongodb и извикване на init метода във файла app.js на всяко приложение, което се нуждае от достъп до моделите.
- Създайте споделен проект - Създайте нов проект за възел, като следвате стандартния процес.
-
package.json - В споделения проект задайте своя
package.json
файлът да съдържа следния запис:"main": "index.js"
-
Добавяне на модел - Създаване на нови
models
папка във вашия споделен проект, за да съдържа всичките ви мангустови схеми и добавки. Добавете вашия файл userSchema към папката models и го наименувайтеuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - След това в корена на проекта
index.js
файл създава споделен обект, който може да се използва от вашите приложения, излагайки моделите иinit
метод. Има много начини да кодирате това, но ето как го правя: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;
- Посочете вашите
common
проекта - Независимо от това, че искате да посочите споделения си проект, добавете препратката към споделения проект вpackage.json
файл във вашето приложение и му дайте имеcommon
. Лично аз използвах GitHub за съхраняване на проекта и посочих пътя на хранилището. Тъй като моето хранилище беше частно, трябваше да използвам ключ в пътя, който е разгледан на сайта за поддръжка на GitHub. -
Включете моделите във вашето приложение - В началния скрипт за вашето приложение (да приемем, че е
app.js
за този пример) добавете препратката към вашияcommon
проект и извикайтеinit
метод за свързване към сървъра на mongodb и регистриране на моделите.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Използвайте модела навсякъде в приложението си - Сега, когато mongoose има установен пул за свързване и моделите са регистрирани, можете да използвате моделите във всеки един от класовете във вашето приложение. Да речем например, че имате страница, която показва информация за
user
можете да го направите така (нетестван код, просто написах това за пример):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}}); }); });
РЕДАКТИРАНЕ Съжалявам, не видях реда, в който наследявате една схема от друга. Както се казва в един от другите отговори, mongoose вече предлага концепцията за plugin
. Във вашия пример по-горе бихте направили това:
Във вашия общ модул, под „/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.
}
Във вашия общ модул, под „/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);