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.
- Crear un proyecto compartido - Crear un nuevo proyecto de nodo, siguiendo el proceso estándar.
-
paquete.json - En el proyecto compartido, configure su
package.json
archivo que contenga la siguiente entrada:"main": "index.js"
-
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 nombreuser.js
.var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Luego en la raíz del proyecto
index.js
crea un objeto compartido que pueden usar tus aplicaciones, exponiendo los modelos y uninit
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;
- Haga referencia a su
common
proyecto - Independientemente de cómo desee hacer referencia a su proyecto compartido, agregue la referencia al proyecto compartido en elpackage.json
archivo dentro de su aplicación y asígnele un nombre decommon
. 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. -
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 sucommon
proyecto y llamar alinit
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);
-
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);