2012-03-31 4 views
49

Ich möchte meine Mongoose-Modelle in einer separaten Datei trennen. Ich habe so wie dies zu tun versucht:Definieren von Mongoose-Modellen in einem separaten Modul

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

var Material = new Schema({ 
    name    : {type: String, index: true}, 
    id     : ObjectId, 
    materialId   : String, 
    surcharge   : String, 
    colors    : { 
     colorName  : String, 
     colorId   : String, 
     surcharge  : Number 
    } 
}); 

var SeatCover = new Schema({ 
    ItemName   : {type: String, index: true}, 
    ItemId    : ObjectId, 
    Pattern    : String, 
    Categories   : { 
     year   : {type: Number, index: true}, 
     make   : {type: String, index: true}, 
     model   : {type: String, index: true}, 
     body   : {type: String, index: true} 
    }, 
    Description   : String, 
    Specifications  : String, 
    Price    : String, 
    Cost    : String, 
    Pattern    : String, 
    ImageUrl   : String, 
    Materials   : [Materials] 
}); 

mongoose.connect('mongodb://127.0.0.1:27017/sc'); 

var Materials = mongoose.model('Materials', Material); 
var SeatCovers = mongoose.model('SeatCover', SeatCover); 

exports.Materials = Materials; 
exports.SeatCovers = SeatCovers; 

Dann habe ich versucht, das Modell wie folgt zu verwenden:

var models = require('./models'); 

exports.populateMaterials = function(req, res){ 
    console.log("populateMaterials"); 
    for (var i = 0; i < materials.length; i++){ 
     var mat = new models.Materials(); 
     console.log(mat); 
     mat.name = materials[i].variantName; 
     mat.materialId = materials[i].itemNumberExtension; 
     mat.surcharge = materials[i].priceOffset; 
     for (var j = 0; j < materials[i].colors.length; j++){ 
      mat.colors.colorName = materials[i].colors[j].name; 
      mat.colors.colorId = materials[i].colors[j].itemNumberExtension; 
      mat.colors.surcharge = materials[i].colors[j].priceOffset; 
     } 
     mat.save(function(err){ 
      if(err){ 
       console.log(err); 
      } else { 
       console.log('success'); 
      } 
     }); 
    } 
    res.render('index', { title: 'Express' }); 
}; 

Ist dies ein sinnvoller Ansatz ein Modell in einem separaten Modul zu werben?

+1

Sollte '[Material]' statt '[Materialien]' sein, nicht wahr? – Tinou

+0

Nein, Materialien ist der Name von Model, auf das Schema Bezug nimmt. Material ist lediglich der Name einer lokalen Variablen. –

Antwort

8

Der grundlegende Ansatz sieht vernünftig aus.

Als Option können Sie ein "Provider" -Modul mit integrierter Modell- und Controllerfunktionalität in Erwägung ziehen. Auf diese Weise könnte die app.js den Provider instanziieren und dann alle Controllerfunktionen ausführen. Die app.js muss nur die Routen mit der entsprechenden zu implementierenden Controller-Funktionalität angeben.

Um etwas weiter aufzuräumen, könnten Sie auch die Verzweigung der Routen in ein separates Modul mit app.js als Bindeglied zwischen diesen Modulen in Erwägung ziehen.

+0

Danke! Ich werde es versuchen. –

+2

Ich wäre gespannt, ein Beispiel zu sehen, wie man das verwaltet –

+3

https://github.com/cmarin/MongoDB-Node-Express-Blog ist eine gute Umsetzung des oben skizzierten Konzepts. – almypal

70

Ich möchte die Datenbank außerhalb der Modelldatei definieren, so dass sie mit nconf konfiguriert werden kann. Ein weiterer Vorteil ist, dass Sie die Mongo-Verbindung außerhalb der Modelle wiederverwenden können.

module.exports = function(mongoose) { 
    var Material = new Schema({ 
     name    : {type: String, index: true}, 
     id     : ObjectId, 
     materialId   : String, 
     surcharge   : String, 
     colors    : { 
      colorName  : String, 
      colorId   : String, 
      surcharge  : Number 
     } 
    }); 
    // declare seat covers here too 
    var models = { 
     Materials : mongoose.model('Materials', Material), 
     SeatCovers : mongoose.model('SeatCovers', SeatCover) 
    }; 
    return models; 
} 

und dann würden Sie es so nennen ...

var mongoose = require('mongoose'); 
mongoose.connect(config['database_url']); 
var models = require('./models')(mongoose); 
var velvet = new models.Materials({'name':'Velvet'}); 
+14

+1 für diesen Ansatz. Ich persönlich nutze das selbst und dachte, ich wäre der Einzige. Schön zu sehen, dass ich von Anfang an etwas mache. –

+0

Sie müssen createConnection nicht in Ihrer Modelldatei verwenden? – alexislg

+0

Nein, eigentlich denke ich, es ist besser, wenn du es nicht tust. Die Models brauchen ein Mungo-Objekt und das ist alles, was sie interessiert. Es ist besser, das Verbindungsmanagement an einem einzigen Ort zu haben und das Mungose-Objekt zu "injizieren". Dies ist die beste Vorgehensweise für das Konfigurationsmanagement und die Wiederverwendung von Code. –