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.jsonarchivo que contenga la siguiente entrada:"main": "index.js" -
Añadir un modelo - Crear nuevos
modelscarpeta 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.jscrea un objeto compartido que pueden usar tus aplicaciones, exponiendo los modelos y uninitmé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
commonproyecto - Independientemente de cómo desee hacer referencia a su proyecto compartido, agregue la referencia al proyecto compartido en elpackage.jsonarchivo 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.jspara este ejemplo) agregue la referencia a sucommonproyecto y llamar alinitmé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
userpodrí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);