sql >> Databáze >  >> NoSQL >> MongoDB

Schémata v externím modulu nefungují v Node.js

Osobně jsem vytvořil samostatný „společný“ projekt s metodou init pro registraci všech modelů pomocí mongodb a volání metody init v souboru app.js všech aplikací, které potřebují přístup k modelům.

  1. Vytvořte sdílený projekt - Vytvořte nový projekt uzlu podle standardního postupu.
  2. package.json – Ve sdíleném projektu nastavte package.json soubor, který bude obsahovat následující položku:

    "main": "index.js"
    
  3. Přidat model - Vytvořte nové models složku ve vašem sdíleném projektu, která bude obsahovat všechna vaše mongoose schémata a pluginy. Přidejte svůj soubor userSchema do složky modelů a pojmenujte jej user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Poté v kořenovém adresáři projektu index.js soubor vytvořit sdílený objekt, který mohou používat vaše aplikace, odhalující modely a init metoda. Existuje mnoho způsobů, jak to kódovat, ale dělám to takto:

    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. Uveďte své common projekta – Ať už chcete na sdílený projekt odkazovat, přidejte odkaz na sdílený projekt do package.json soubor ve vaší aplikaci a pojmenujte jej common . Osobně jsem použil GitHub k uložení projektu a odkazoval na cestu k úložišti. Protože moje úložiště bylo soukromé, musel jsem v cestě použít klíč, který je popsán na webu podpory GitHubu.
  6. Spusťte modely v aplikaci – Ve spouštěcím skriptu vaší aplikace (předpokládejme, že je to app.js pro tento příklad) přidejte odkaz na váš common projekt a zavolejte init způsob připojení k serveru mongodb a registraci modelů.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Použijte model kdekoli v aplikaci - Nyní, když má mongoose vytvořený fond připojení a modely byly zaregistrovány, můžete použít modely jakékoli třídy ve vaší aplikaci. Řekněme například, že máte stránku, která zobrazuje informace o user můžete to udělat takto (netestovaný kód, napsal jsem to jen pro příklad):

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

UPRAVIT Promiňte, neviděl jsem řádek, kde jste dědili jedno schéma z druhého. Jak bylo uvedeno v jedné z dalších odpovědí, mongoose již nabízí koncept plugin . Ve výše uvedeném příkladu byste udělali toto:

Ve vašem společném modulu pod '/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.
}

Ve vašem společném modulu pod '/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. Aktualizujte mnoho v mongoose

  2. MongoDB třídí dokumenty podle vnořených dat

  3. Jak indexovat, aby textové vyhledávání a řazení používalo index?

  4. Heroku nemohl ověřit mongolab