2016-07-08 9 views
3

Betrachten wir eine sehr einfache Express 4 App-Struktur:Wie wird ein Mungo-Modell in einer separaten Datei definiert, wenn die Datei nicht exportiert wird?

-- app.js 
-- models 
    |--db.js 
    |--news.js 

wo news.js ein Mungo-Schema und ein Modell auf diesem Schema basiert enthält:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var newsSchema = new Schema({ 
    title: String, 
    subtitle: String, 
    // other fields... 
}); 

var News = mongoose.model('News', newsSchema); 

Zu meinem Verständnis, um für app.js die verwenden News Modell, es muss die Datei innerhalb des Skripts wie folgt erfordern: require('./models/news'). Auch news.js müsste das Modell so exportieren: module.exports = News;.

Ich bin jedoch auf eine Reihe von Skripten gestoßen, die keine Modelle (oder irgendetwas anderes) exportieren, die in einer separaten Datei definiert sind, während sie diese Modelle und/oder Schemata in einer anderen Datei verwenden können die Modelldatei und dann etwas wie folgt:

var mongoose = require('mongoose'); 
var News = mongoose.model('News'); 

Wie ist dieses Verhalten möglich? Es ist eine Besonderheit von Mungo? Wie kann eine Datei ein in einer anderen Datei definiertes Modell oder Schema verwenden, wenn dieses Modell/Schema nicht in dieser Datei exportiert wird?

Antwort

3

Dies funktioniert schließlich, weil wenn Sie require('mongoose') in verschiedenen Dateien aufrufen, erhalten Sie das gleiche Objekt zurück. Mit anderen Worten: Es wird in Ihrem Fall zwischen app.js und news.js geteilt.

Wenn Sie ein neues Modell erstellen (mit mongoose.Model('Name', schema)), speichert Mungo diese Modellinstanz in einer internen Modellliste.

Damit können Sie auch eine Instanz anhand des Namens mithilfe von mongoose.Model('Name') abrufen. Mungo wird dieses Modell in seiner internen Liste nachschlagen und es zurückgeben.

+2

Hallo Robert! Danke für Ihre Antwort! Also ist die 'Mungo'-Instanz, die durch Aufruf von 'require (' mongoose ')' zurückgegeben wird, ein Singleton? Sobald ein Modell registriert ist, wird es somit ein Teil des "Mungo" Singletons. Solange die Verbindung gleich bleibt, würde der Aufruf von 'mongoose' aus jedem Skript der App mir Zugriff auf die definierten Modelle gewähren. Ist das richtig? –

+0

Es macht jetzt Sinn für mich. Aber erstreckt sich das gleiche Verhalten auch auf das Schema? Wenn ich ein Schema in einem Skript definiere und es nicht exportiere, haben andere Skripte, die 'require ('mongoose')' aufrufen, Zugriff auf das Schema? Oder ist dieses Verhalten auf Modelle beschränkt, aber nicht auf das Schema? –

+1

@ArenLi Ja, es ist im Grunde ein Singleton. Dasselbe gilt nicht für das Schema, nur Modelle. Ich denke, das liegt daran, dass das Schema als "privat" betrachtet wird: Es ist nicht von Nutzen, neben dem Erstellen von Modellen mit (zum Beispiel, wenn Sie ein Modell aus einem Schema erstellt haben, können Sie das Schema für das Modell nicht ändern). – robertklep

Verwandte Themen