sql >> Database teknologi >  >> NoSQL >> MongoDB

Skemaer i eksternt modul virker ikke i Node.js

Personligt har jeg oprettet et separat "fælles" projekt med en init-metode til at registrere alle modellerne med mongodb og kalde init-metoden i app.js-filen for alle apps, der har brug for adgang til modellerne.

  1. Opret et delt projekt - Opret et nyt nodeprojekt efter standardprocessen.
  2. package.json - Indstil din package.json i det delte projekt fil til at indeholde følgende post:

    "main": "index.js"
    
  3. Tilføj en model - Opret en ny models mappe i dit delte projekt, for at indeholde alle dine mongoose-skemaer og plugins. Tilføj din userSchema-fil til mappen models, og giv den navnet user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Derefter i projektets rod index.js fil opret et delt objekt, der kan bruges af dine apps, eksponerer modellerne og en init metode. Der er mange måder at kode dette på, men sådan gør jeg det:

    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. Referer til din common projekt - Uanset hvordan du vil referere til dit delte projekt, skal du tilføje referencen til det delte projekt i package.json fil i din app, og giv den et navn common . Personligt brugte jeg GitHub til at gemme projektet og refererede til depotstien. Da mit lager var privat, var jeg nødt til at bruge en nøgle i stien, som er dækket på GitHub-supportsiden.
  6. Indsæt modellerne i din app - I startscriptet til din app (lad os antage, at det er app.js for dette eksempel) tilføj referencen til din common projekt og kald init metode til at oprette forbindelse til mongodb-serveren og registrere modellerne.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Brug modellen hvor som helst i din app - Nu hvor mongoose har oprettet forbindelsespuljen, og modellerne er blevet registreret, kan du bruge modellerne i enhver af klasserne i din app. Lad os f.eks. sige, at du har en side, der viser oplysninger om en user du kunne gøre det sådan her (utestet kode, skrev lige dette som et eksempel):

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

REDIGER Beklager, jeg så ikke linjen, hvor du arvede et skema fra et andet. Som et af de andre svar sagde, tilbyder mongoose allerede konceptet med et plugin . I dit eksempel ovenfor ville du gøre dette:

I dit fælles modul, under '/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.
}

I dit fælles modul, under '/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. Node.js &Redis; Venter på, at en løkke er færdig

  2. Brug af MongoDB $pull til at slette dokumenter i et array

  3. MongoDB $divide

  4. Bedste måde at gemme dato/tid i mongodb