MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Gli schemi nel modulo esterno non funzionano in Node.js

Personalmente ho creato un progetto "comune" separato con un metodo init per registrare tutti i modelli con mongodb e chiamare il metodo init nel file app.js di tutte le app che necessitano di accedere ai modelli.

  1. Crea un progetto condiviso - Crea un nuovo progetto di nodo, seguendo la procedura standard.
  2. package.json - Nel progetto condiviso, imposta il tuo package.json file per contenere la seguente voce:

    "main": "index.js"
    
  3. Aggiungi un modello - Crea un nuovo models cartella all'interno del tuo progetto condiviso, per contenere tutti i tuoi schemi e plug-in mangusta. Aggiungi il tuo file userSchema alla cartella models e chiamalo user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Quindi nella radice del progetto index.js file crea un oggetto condiviso che può essere utilizzato dalle tue app, esponendo i modelli e un init metodo. Ci sono molti modi per codificarlo, ma ecco come lo sto facendo:

    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. Fai riferimento al tuo common progetto - Comunque tu voglia fare riferimento al tuo progetto condiviso, aggiungi il riferimento al progetto condiviso in package.json file all'interno della tua app e assegnagli un nome common . Personalmente ho usato GitHub per archiviare il progetto e ho fatto riferimento al percorso del repository. Poiché il mio repository era privato, ho dovuto utilizzare una chiave nel percorso, che è trattata sul sito di supporto di GitHub.
  6. Inizia i modelli nella tua app - Nello script di avvio della tua app (supponiamo che sia app.js per questo esempio) aggiungi il riferimento al tuo common progetto e chiamare init metodo per connettersi al server mongodb e registrare i modelli.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Utilizza il modello ovunque nella tua app - Ora che Mongoose ha stabilito il pool di connessioni e i modelli sono stati registrati, puoi utilizzare i modelli in qualsiasi classe all'interno della tua app. Ad esempio, supponiamo di avere una pagina che mostra informazioni su un user potresti farlo in questo modo (codice non testato, l'ho appena scritto per un esempio):

    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}});
        });
    });
    

MODIFICA Scusa, non ho visto la riga in cui stavi ereditando uno schema da un altro. Come affermato in una delle altre risposte, mongoose offre già il concetto di plugin . Nel tuo esempio sopra, dovresti fare questo:

Nel tuo modulo comune, in '/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.
}

Nel tuo modulo comune, in '/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);