sql >> Base de Datos >  >> NoSQL >> MongoDB

Los esquemas en el módulo externo no funcionan en Node.js

Personalmente, creé un proyecto "común" separado con un método init para registrar todos los modelos con mongodb y llamar al método init en el archivo app.js de cualquier aplicación que necesite acceso a los modelos.

  1. Crear un proyecto compartido - Crear un nuevo proyecto de nodo, siguiendo el proceso estándar.
  2. paquete.json - En el proyecto compartido, configure su package.json archivo que contenga la siguiente entrada:

    "main": "index.js"
    
  3. Añadir un modelo - Crear nuevos models carpeta dentro de su proyecto compartido, para contener todos sus esquemas y complementos de mongoose. Agregue su archivo userSchema a la carpeta de modelos y asígnele el nombre user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Luego en la raíz del proyecto index.js crea un objeto compartido que pueden usar tus aplicaciones, exponiendo los modelos y un init método. Hay muchas formas de codificar esto, pero así es como lo hago:

    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. Haga referencia a su common proyecto - Independientemente de cómo desee hacer referencia a su proyecto compartido, agregue la referencia al proyecto compartido en el package.json archivo dentro de su aplicación y asígnele un nombre de common . Personalmente, utilicé GitHub para almacenar el proyecto e hice referencia a la ruta del repositorio. Dado que mi repositorio era privado, tuve que usar una clave en la ruta, que está cubierta en el sitio de soporte de GitHub.
  6. Inicie los modelos en su aplicación - En el script de inicio de su aplicación (supongamos que es app.js para este ejemplo) agregue la referencia a su common proyecto y llamar al init método para conectarse al servidor mongodb y registrar los modelos.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Use el modelo en cualquier parte de su aplicación - Ahora que mongoose ha establecido el grupo de conexiones y los modelos se han registrado, puede usar los modelos en cualquiera de las clases dentro de su aplicación. Por ejemplo, supongamos que tiene una página que muestra información sobre un user podrías hacerlo así (código no probado, solo escribí esto como ejemplo):

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

EDITAR Lo siento, no vi la línea en la que estabas heredando un esquema de otro. Como dijo una de las otras respuestas, mongoose ya ofrece el concepto de un plugin . En tu ejemplo anterior, harías esto:

En su módulo común, en '/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.
}

En su módulo común, en '/modelos/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);