52 Stimmen

Definition von Mongoose-Modellen in einem separaten Modul

Ich möchte meine Mongoose-Modelle in einer separaten Datei speichern. Ich habe versucht, dies wie folgt zu tun:

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, um ein Modell in einem separaten Modul zu referenzieren?

77voto

Michael Connor Punkte 3972

Ich möchte die Datenbank außerhalb der Modelldatei definieren, damit sie mit nconf konfiguriert werden kann. Ein weiterer Vorteil ist, dass Sie die Mongo-Verbindung außerhalb der Models 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ürde man es so nennen...

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

8voto

almypal Punkte 6542

Der Grundansatz scheint vernünftig zu sein.

Als Option könnten Sie ein "Provider"-Modul mit integrierten Modell- und Steuerungsfunktionen in Betracht ziehen. Auf diese Weise könnte die app.js den Provider instanziieren und alle Controller-Funktionen können dann von ihm ausgeführt werden. Die app.js muss nur die Routen mit der entsprechenden Controller-Funktionalität angeben, die implementiert werden soll.

Um ein wenig mehr Ordnung zu schaffen, könnten Sie auch erwägen, die Routen in ein separates Modul zu verzweigen, wobei app.js als Klebstoff zwischen diesen Modulen dient.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X