MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Schemata im externen Modul funktionieren nicht in Node.js

Persönlich habe ich ein separates "allgemeines" Projekt mit einer Init-Methode erstellt, um alle Modelle bei mongodb zu registrieren und die Init-Methode in der Datei app.js aller Apps aufzurufen, die Zugriff auf die Modelle benötigen.

  1. Gemeinsames Projekt erstellen - Erstellen Sie ein neues Node-Projekt gemäß dem Standardprozess.
  2. Paket.json - Legen Sie im freigegebenen Projekt Ihre package.json fest Datei mit folgendem Eintrag:

    "main": "index.js"
    
  3. Modell hinzufügen - Erstellen Sie ein neues models Ordner innerhalb Ihres freigegebenen Projekts, um alle Ihre Mongoose-Schemas und Plugins zu enthalten. Fügen Sie Ihre userSchema-Datei zum Ordner „models“ hinzu und nennen Sie sie user.js .

    var mongoose = require('mongoose');
    
    var userSchema = new mongoose.Schema({
        email: String
    });
    
    module.exports = mongoose.model('User', userSchema);
    
  4. index.js - Dann im Stammverzeichnis des Projekts index.js Datei ein gemeinsam genutztes Objekt erstellen, das von Ihren Apps verwendet werden kann, indem die Modelle und ein init verfügbar gemacht werden Methode. Es gibt viele Möglichkeiten, dies zu codieren, aber hier ist, wie ich es mache:

    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. Verweisen Sie auf Ihren common Projekt - Wie auch immer Sie auf Ihr freigegebenes Projekt verweisen möchten, fügen Sie den Verweis auf das freigegebene Projekt in package.json hinzu Datei in Ihrer App und geben Sie ihr den Namen common . Persönlich habe ich GitHub zum Speichern des Projekts verwendet und auf den Repository-Pfad verwiesen. Da mein Repository privat war, musste ich einen Schlüssel im Pfad verwenden, der auf der GitHub-Support-Site behandelt wird.
  6. Initiieren Sie die Modelle in Ihrer App - Im Startskript für Ihre App (nehmen wir an, es ist app.js für dieses Beispiel) fügen Sie den Verweis zu Ihrem common hinzu project und rufen Sie init auf -Methode, um eine Verbindung zum Mongodb-Server herzustellen und die Modelle zu registrieren.

    //at the top, near your other module dependencies
    var mongoose = require('mongoose')
      , common = require('common');
    
    common.init(mongoose);
    
  7. Verwenden Sie das Modell überall in Ihrer App - Nachdem Mongoose den Verbindungspool eingerichtet hat und die Modelle registriert wurden, können Sie die Modelle in jeder der Klassen in Ihrer App verwenden. Angenommen, Sie haben eine Seite, die Informationen über einen user anzeigt Sie könnten es so machen (ungetesteter Code, habe dies nur als Beispiel geschrieben):

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

BEARBEITEN Entschuldigung, ich habe die Zeile nicht gesehen, in der Sie ein Schema von einem anderen geerbt haben. Wie in einer der anderen Antworten angegeben, bietet Mongoose bereits das Konzept eines plugin an . In Ihrem obigen Beispiel würden Sie Folgendes tun:

In Ihrem gemeinsamen Modul unter '/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.
}

In Ihrem gemeinsamen Modul unter '/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);