Osobně jsem vytvořil samostatný „společný“ projekt s metodou init pro registraci všech modelů pomocí mongodb a volání metody init v souboru app.js všech aplikací, které potřebují přístup k modelům.
- Vytvořte sdílený projekt - Vytvořte nový projekt uzlu podle standardního postupu.
-
package.json – Ve sdíleném projektu nastavte
package.json
soubor, který bude obsahovat následující položku:"main": "index.js"
-
Přidat model - Vytvořte nové
models
složku ve vašem sdíleném projektu, která bude obsahovat všechna vaše mongoose schémata a pluginy. Přidejte svůj soubor userSchema do složky modelů a pojmenujte jejuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Poté v kořenovém adresáři projektu
index.js
soubor vytvořit sdílený objekt, který mohou používat vaše aplikace, odhalující modely ainit
metoda. Existuje mnoho způsobů, jak to kódovat, ale dělám to takto: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;
- Uveďte své
common
projekta – Ať už chcete na sdílený projekt odkazovat, přidejte odkaz na sdílený projekt dopackage.json
soubor ve vaší aplikaci a pojmenujte jejcommon
. Osobně jsem použil GitHub k uložení projektu a odkazoval na cestu k úložišti. Protože moje úložiště bylo soukromé, musel jsem v cestě použít klíč, který je popsán na webu podpory GitHubu. -
Spusťte modely v aplikaci – Ve spouštěcím skriptu vaší aplikace (předpokládejme, že je to
app.js
pro tento příklad) přidejte odkaz na vášcommon
projekt a zavolejteinit
způsob připojení k serveru mongodb a registraci modelů.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Použijte model kdekoli v aplikaci - Nyní, když má mongoose vytvořený fond připojení a modely byly zaregistrovány, můžete použít modely jakékoli třídy ve vaší aplikaci. Řekněme například, že máte stránku, která zobrazuje informace o
user
můžete to udělat takto (netestovaný kód, napsal jsem to jen pro příklad):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}}); }); });
UPRAVIT Promiňte, neviděl jsem řádek, kde jste dědili jedno schéma z druhého. Jak bylo uvedeno v jedné z dalších odpovědí, mongoose již nabízí koncept plugin
. Ve výše uvedeném příkladu byste udělali toto:
Ve vašem společném modulu 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.
}
Ve vašem společném modulu 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);