Personnellement, j'ai créé un projet "commun" séparé avec une méthode init pour enregistrer tous les modèles avec mongodb et appeler la méthode init dans le fichier app.js de toutes les applications qui ont besoin d'accéder aux modèles.
- Créer un projet partagé - Créez un nouveau projet de nœud, en suivant le processus standard.
-
paquet.json - Dans le projet partagé, définissez votre
package.json
fichier contenant l'entrée suivante :"main": "index.js"
-
Ajouter un modèle - Créer un nouveau
models
dossier dans votre projet partagé, pour contenir tous vos schémas et plugins mongoose. Ajoutez votre fichier userSchema au dossier models et nommez-leuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Puis à la racine du projet
index.js
crée un objet partagé qui peut être utilisé par vos applications, exposant les modèles et uninit
méthode. Il existe de nombreuses façons de coder cela, mais voici comment je procède :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;
- Référencez votre
common
projet - Quelle que soit la manière dont vous souhaitez référencer votre projet partagé, ajoutez la référence au projet partagé dans lepackage.json
fichier dans votre application et nommez-lecommon
. Personnellement, j'ai utilisé GitHub pour stocker le projet et référencé le chemin du référentiel. Étant donné que mon référentiel était privé, j'ai dû utiliser une clé dans le chemin, qui est couvert sur le site de support GitHub. -
Initier les modèles dans votre application - Dans le script de démarrage de votre application (supposons qu'il s'agit de
app.js
pour cet exemple) ajoutez la référence à votrecommon
projet et appelez leinit
méthode pour se connecter au serveur mongodb et enregistrer les modèles.//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Utilisez le modèle n'importe où dans votre application - Maintenant que mongoose a établi le pool de connexions et que les modèles ont été enregistrés, vous pouvez utiliser les modèles dans n'importe quelle classe de votre application. Par exemple, supposons que vous ayez une page qui affiche des informations sur un
user
vous pouvez le faire comme ceci (code non testé, je viens d'écrire ceci pour un exemple) :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}}); }); });
MODIFIER Désolé, je n'ai pas vu la ligne où vous héritiez d'un schéma d'un autre. Comme l'une des autres réponses l'a indiqué, la mangouste propose déjà le concept d'un plugin
. Dans votre exemple ci-dessus, vous feriez ceci :
Dans votre module commun, sous '/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.
}
Dans votre module commun, sous '/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);