web-dev-qa-db-fra.com

Définition de modèles de mangouste 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é?

51
rob_hicks

L'approche de base semble raisonnable.

En option, vous pouvez envisager un module "fournisseur" avec des fonctionnalités de modèle et de contrôleur intégrées. De cette façon, vous pouvez demander au fichier app.js d'instancier le fournisseur, puis toutes les fonctions du contrôleur peuvent être exécutées par celui-ci. L'application.js doit uniquement spécifier les routes avec la fonctionnalité de contrôleur correspondante à implémenter.

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

8
almypal

J'aime définir la base de données en dehors du fichier de modèles afin qu'elle puisse être configurée à 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 puis tu appellerais ça comme ça ...

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