MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Esquemas no módulo externo não funcionam no Node.js


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.
  1. Crie um projeto compartilhado - Crie um novo projeto de nó, seguindo o processo padrão.

  2. pacote.json - No projeto compartilhado, defina seu package.json arquivo para conter a seguinte entrada:
    "main": "index.js"
    

  3. Adicionar um modelo - Crie um novo models dentro do seu projeto compartilhado, para conter todos os seus esquemas e plugins do mangusto. Adicione seu arquivo userSchema à pasta de modelos e nomeie-o user.js .
    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    

  4. index.js - Em seguida, na raiz do projeto index.js cria um objeto compartilhado que pode ser usado por seus aplicativos, expondo os modelos e um init 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;
    
  5. 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 no package.json arquivo dentro de seu aplicativo e dê a ele um nome de common . 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.

  6. Inicie os modelos em seu aplicativo - No script de início do seu aplicativo (vamos supor que seja app.js para este exemplo) adicione a referência ao seu common projeto e chame o init 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);
    

  7. 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 um user 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);