Pessoalmente, criei um projeto "comum" separado com um método init para registrar todos os modelos com mongodb e chamar o método init no arquivo app.js de qualquer aplicativo que precise de acesso aos modelos.
- Crie um projeto compartilhado - Crie um novo projeto de nó, seguindo o processo padrão.
-
pacote.json - No projeto compartilhado, defina seupackage.json
arquivo para conter a seguinte entrada:
"main": "index.js"
-
Adicionar um modelo - Crie um novomodels
dentro do seu projeto compartilhado, para conter todos os seus esquemas e plugins do mangusto. Adicione seu arquivo userSchema à pasta de modelos e nomeie-ouser.js
.
var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js - Em seguida, na raiz do projetoindex.js
cria um objeto compartilhado que pode ser usado por seus aplicativos, expondo os modelos e uminit
método. Há muitas maneiras de codificar isso, mas aqui está como estou fazendo:
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;
- Faça referência ao seu
common
projeto - No entanto, você deseja fazer referência ao seu projeto compartilhado, adicione a referência ao projeto compartilhado nopackage.json
arquivo dentro de seu aplicativo e dê a ele um nome decommon
. Pessoalmente, usei o GitHub para armazenar o projeto e referenciei o caminho do repositório. Como meu repositório era privado, tive que usar uma chave no caminho, que é abordado no site de suporte do GitHub. -
Inicie os modelos em seu aplicativo - No script de início do seu aplicativo (vamos supor que sejaapp.js
para este exemplo) adicione a referência ao seucommon
projeto e chame oinit
método para se conectar ao servidor mongodb e registrar os modelos.
//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
Use o modelo em qualquer lugar do seu aplicativo - Agora que o mongoose tem o pool de conexão estabelecido e os modelos registrados, você pode usar os modelos em qualquer uma das classes do seu aplicativo. Por exemplo, digamos que você tenha uma página que exibe informações sobre umuser
você poderia fazer assim (código não testado, apenas escrevi isso para um exemplo):
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 Desculpe, não vi a linha em que você estava herdando um esquema de outro. Como uma das outras respostas afirmou, o mangusto já oferece o conceito de um
plugin
. No seu exemplo acima, você faria assim:Em seu módulo comum, em '/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.
}
Em seu módulo comum, em '/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);