sql >> Databasteknik >  >> NoSQL >> MongoDB

Scheman i extern modul fungerar inte i Node.js

Personligen skapade jag ett separat "gemensamt" projekt med en init-metod för att registrera alla modeller med mongodb, och anropa init-metoden i app.js-filen för alla appar som behöver åtkomst till modellerna.

  1. Skapa ett delat projekt - Skapa ett nytt nodprojekt enligt standardprocessen.
  2. package.json - I det delade projektet ställer du in ditt package.json fil som innehåller följande post:

    "main": "index.js"
    
  3. Lägg till en modell - Skapa en ny models mapp i ditt delade projekt, för att innehålla alla dina mongoose-scheman och plugins. Lägg till din userSchema-fil i mappen models och döp den till user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Sedan i projektets rot index.js fil skapa ett delat objekt som kan användas av dina appar, exponera modellerna och en init metod. Det finns många sätt att koda detta, men så här gör jag:

    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. Referera till din common projekt - Hur du än vill referera till ditt delade projekt, lägg till referensen till det delade projektet i package.json fil i din app och ge den namnet common . Personligen använde jag GitHub för att lagra projektet och refererade till förvarsvägen. Eftersom mitt förråd var privat var jag tvungen att använda en nyckel i sökvägen, som finns på GitHubs supportwebbplats.
  6. Initiera modellerna i din app - I startskriptet för din app (låt oss anta att det är app.js för det här exemplet) lägg till referensen till din common projekt och anropa init metod för att ansluta till mongodb-servern och registrera modellerna.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Använd modellen var som helst i appen – Nu när mongoose har anslutningspoolen etablerad och modellerna har registrerats kan du använda modellerna i någon av klasserna i din app. Säg till exempel att du har en sida som visar information om en user du kan göra det så här (otestad kod, skrev bara detta som ett exempel):

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

REDIGERA Förlåt, jag såg inte raden där du ärvde ett schema från ett annat. Som ett av de andra svaren sa erbjuder mongoose redan konceptet med en plugin . I ditt exempel ovan skulle du göra så här:

I din gemensamma 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 din gemensamma 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. MongoDB insertOne()

  2. Hur man hämtar / hittar alla element i en kapslad array i MongoDB Java

  3. MongoDB C#-drivrutin - Ignorera fält vid bindning

  4. Spring boot 2.0.5.RELEASE och mongo 4.0 anslutningsproblem