52 votes

Définition de modèles Mongoose dans un module séparé

Je voudrais séparer mes modèles Mongoose dans un fichier séparé. J'ai essayé de le faire comme ceci:

 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;
 

Ensuite, j'ai essayé d'utiliser le modèle comme ceci:

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

Est-ce une approche raisonnable pour référencer un modèle dans un module séparé?

75voto

Michael Connor Points 723

J'aime définir la base de données en dehors du fichier de modèles afin de pouvoir la configurer à l'aide de nconf. Un autre avantage est que vous pouvez réutiliser la connexion Mongo en dehors des modèles.

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

et alors vous l'appelleriez comme ça ...

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

8voto

almypal Points 2384

L'approche de base semble raisonnable.

Comme une option que vous pourriez envisager une 'fournisseur' module avec le modèle et la fonctionnalité de contrôleur intégré. De cette façon, vous pourriez avoir de la app.js instancier le fournisseur et ensuite toutes les fonctions de contrôleur peuvent être exécutées par elle. L'app.js a seulement à préciser les itinéraires correspondant à la fonctionnalité de contrôleur à être mis en œuvre.

Pour ranger un peu plus loin, vous pouvez aussi envisager de branchement sur les routes dans un module séparé avec app.js comme une colle entre ces modules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X