MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Les schémas du module externe ne fonctionnent pas dans Node.js

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.

  1. Créer un projet partagé - Créez un nouveau projet de nœud, en suivant le processus standard.
  2. paquet.json - Dans le projet partagé, définissez votre package.json fichier contenant l'entrée suivante :

    "main": "index.js"
    
  3. 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-le user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. 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 un init 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;
    
  5. 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 le package.json fichier dans votre application et nommez-le common . 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.
  6. 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 à votre common projet et appelez le init 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);
    
  7. 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);