sql >> Database >  >> NoSQL >> MongoDB

Schema's in externe module werken niet in Node.js

Persoonlijk heb ik een apart "algemeen" project gemaakt met een init-methode om alle modellen bij mongodb te registreren en de init-methode aan te roepen in het app.js-bestand van alle apps die toegang tot de modellen nodig hebben.

  1. Maak een gedeeld project - Maak een nieuw knooppuntproject volgens het standaardproces.
  2. pakket.json - Stel in het gedeelde project uw package.json . in bestand om de volgende invoer te bevatten:

    "main": "index.js"
    
  3. Een model toevoegen - Maak een nieuwe models map binnen uw gedeelde project, om al uw mangoestschema's en plug-ins te bevatten. Voeg uw userSchema-bestand toe aan de map modellen en noem het user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Dan in de hoofdmap van het project index.js bestand maak een gedeeld object dat door uw apps kan worden gebruikt, waarbij de modellen en een init worden weergegeven methode. Er zijn veel manieren om dit te coderen, maar hier is hoe ik het doe:

    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. Verwijs naar uw common project - Hoe u ook naar uw gedeelde project wilt verwijzen, voeg de verwijzing naar het gedeelde project toe in de package.json bestand in uw app en geef het de naam common . Persoonlijk gebruikte ik GitHub om het project op te slaan en verwees ik naar het repositorypad. Omdat mijn repository privé was, moest ik een sleutel gebruiken in het pad, dat wordt beschreven op de GitHub-ondersteuningssite.
  6. Start de modellen in uw app - In het startscript voor uw app (laten we aannemen dat het app.js is voor dit voorbeeld) voeg de verwijzing toe aan uw common project en roep de init methode om verbinding te maken met de mongodb-server en de modellen te registreren.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Gebruik het model overal in uw app - Nu mangoest de verbindingspool tot stand heeft gebracht en de modellen zijn geregistreerd, kunt u de modellen gebruiken in elk van de klassen binnen uw app. Stel bijvoorbeeld dat u een pagina heeft die informatie weergeeft over een user je zou het als volgt kunnen doen (ongeteste code, heb dit alleen als voorbeeld geschreven):

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

BEWERKEN Sorry, ik heb de regel niet gezien waarin je het ene schema van het andere overnam. Zoals een van de andere antwoorden al zei, biedt mangoest al het concept van een plugin . In uw voorbeeld hierboven zou u dit doen:

In uw algemene module, onder '/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.
}

In uw algemene module, onder '/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);


  1. MongoDB Mongoose bevraagt ​​een diep geneste reeks subdocumenten op datumbereik

  2. Bulkupdate-array van overeenkomend subdocument in Mongodb

  3. Redis SYNC en EXEC

  4. Mongodb geaggregeerde query op specifieke records in plaats van verzameling