MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Схеми във външен модул не работят в Node.js

Лично аз създадох отделен „общ“ проект с init метод за регистриране на всички модели с mongodb и извикване на init метода във файла app.js на всяко приложение, което се нуждае от достъп до моделите.

  1. Създайте споделен проект - Създайте нов проект за възел, като следвате стандартния процес.
  2. package.json - В споделения проект задайте своя package.json файлът да съдържа следния запис:

    "main": "index.js"
    
  3. Добавяне на модел - Създаване на нови models папка във вашия споделен проект, за да съдържа всичките ви мангустови схеми и добавки. Добавете вашия файл userSchema към папката models и го наименувайте user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - След това в корена на проекта index.js файл създава споделен обект, който може да се използва от вашите приложения, излагайки моделите и init метод. Има много начини да кодирате това, но ето как го правя:

    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. Посочете вашите common проекта - Независимо от това, че искате да посочите споделения си проект, добавете препратката към споделения проект в package.json файл във вашето приложение и му дайте име common . Лично аз използвах GitHub за съхраняване на проекта и посочих пътя на хранилището. Тъй като моето хранилище беше частно, трябваше да използвам ключ в пътя, който е разгледан на сайта за поддръжка на GitHub.
  6. Включете моделите във вашето приложение - В началния скрипт за вашето приложение (да приемем, че е app.js за този пример) добавете препратката към вашия common проект и извикайте init метод за свързване към сървъра на mongodb и регистриране на моделите.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Използвайте модела навсякъде в приложението си - Сега, когато mongoose има установен пул за свързване и моделите са регистрирани, можете да използвате моделите във всеки един от класовете във вашето приложение. Да речем например, че имате страница, която показва информация за user можете да го направите така (нетестван код, просто написах това за пример):

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

РЕДАКТИРАНЕ Съжалявам, не видях реда, в който наследявате една схема от друга. Както се казва в един от другите отговори, mongoose вече предлага концепцията за plugin . Във вашия пример по-горе бихте направили това:

Във вашия общ модул, под „/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.
}

Във вашия общ модул, под „/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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да намерите името на полето в MongoDB на произволна дълбочина

  2. Може ли kafka да се свърже - изходният код на mongo се изпълнява като клъстер (max.tasks> 1)

  3. C# MongoDB.Driver GetServer го няма, какво сега?

  4. Как да индексирате, така че търсенето и сортирането на текст да използват индекса?

  5. Как да съхранявате данни на различни езици (не английски) в MongoDB Field и да извличате същите данни?