MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Schematy w zewnętrznym module nie działają w Node.js

Osobiście stworzyłem osobny "wspólny" projekt z metodą init, aby zarejestrować wszystkie modele za pomocą mongodb i wywołać metodę init w pliku app.js każdej aplikacji, która potrzebuje dostępu do modeli.

  1. Utwórz wspólny projekt - Utwórz nowy projekt węzła zgodnie ze standardowym procesem.
  2. package.json - We wspólnym projekcie ustaw swój package.json plik zawierający następujący wpis:

    "main": "index.js"
    
  3. Dodaj model - Utwórz nowe models folder w ramach współdzielonego projektu, aby zawierał wszystkie schematy i wtyczki mongoose. Dodaj plik userSchema do folderu modeli i nazwij go user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Następnie w katalogu głównym projektu index.js plik utwórz współdzielony obiekt, który może być używany przez twoje aplikacje, odsłaniając modele i init metoda. Jest wiele sposobów na zakodowanie tego, ale oto jak to robię:

    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. Odwołaj się do common projekt - Jakkolwiek chcesz odwołać się do współdzielonego projektu, dodaj odwołanie do współdzielonego projektu w package.json plik w Twojej aplikacji i nadaj mu nazwę common . Osobiście użyłem GitHub do przechowywania projektu i odwoływałem się do ścieżki repozytorium. Ponieważ moje repozytorium było prywatne, musiałem użyć klucza w ścieżce, która jest opisana na stronie wsparcia GitHub.
  6. Uruchom modele w swojej aplikacji - W skrypcie startowym Twojej aplikacji (załóżmy, że jest to app.js dla tego przykładu) dodaj odwołanie do swojego common projektu i wywołaj init metoda połączenia z serwerem mongodb i zarejestrowania modeli.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Użyj modelu w dowolnym miejscu w aplikacji - Teraz, gdy mangusta ma ustanowioną pulę połączeń i modele zostały zarejestrowane, możesz używać modeli w dowolnej klasie w swojej aplikacji. Załóżmy na przykład, że masz stronę wyświetlającą informacje o user możesz to zrobić w ten sposób (nieprzetestowany kod, po prostu napisałem to jako przykład):

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

EDYTUJ Przepraszamy, nie widziałem wiersza, w którym dziedziczyłeś jeden schemat po drugim. Jak podano w jednej z innych odpowiedzi, mangusta już oferuje koncepcję plugin . W powyższym przykładzie zrobiłbyś to:

W Twoim wspólnym module, 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.
}

We wspólnym module, 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak wdrożyć serwer Percona dla MongoDB w celu zapewnienia wysokiej dostępności

  2. Dane sprężyny Dopasuj i filtruj zagnieżdżoną tablicę

  3. Przetestuj @Transactional z osadzonym MongoDB Flapdoodle w Spring Boot

  4. Błąd połączenia mongodb sprężyny rozruchowej

  5. Liczba agregatów MongoDB jest zbyt wolna