2012-03-31 17 views
49

Me gustaría separar mis modelos de mangosta en un archivo separado. He intentado hacerlo de esta manera:Definición de modelos de mangosta en el módulo separado

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; 

entonces, he intentado utilizar el modelo de la siguiente manera:

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

Es este un enfoque razonable para hacer referencia a un modelo en un módulo separado?

+1

debería ser '[material]' en lugar de '[Materiales] ', no? – Tinou

+0

No, Materials es el nombre del modelo, que es a qué referencia de esquema. El material es simplemente el nombre de una variable local. –

Respuesta

8

El enfoque básico parece razonable.

Como opción, podría considerar un módulo de 'proveedor' con la funcionalidad de modelo y controlador integrada. De esta forma, podría hacer que app.js creara una instancia del proveedor y luego todas las funciones del controlador puedan ser ejecutadas por él. El app.js solo debe especificar las rutas con la funcionalidad de controlador correspondiente para implementar.

Para arreglar un poco más, también podría considerar la bifurcación de las rutas en un módulo separado con app.js como un pegamento entre estos módulos.

+0

Gracias! Lo probaré. –

+2

Me gustaría ver un ejemplo sobre cómo administrar ese –

+3

https://github.com/cmarin/MongoDB-Node-Express-Blog es una buena implementación del concepto descrito anteriormente. – almypal

70

Me gusta definir la base de datos fuera del archivo de modelos para que se pueda configurar usando nconf. Otra ventaja es que puedes reutilizar la conexión Mongo fuera de los modelos.

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

y luego lo llamaría así ...

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

+1 para este enfoque. Yo personalmente uso esto yo mismo y pensé que era el único. Es bueno ver que finalmente estoy haciendo algo bien desde el principio. –

+0

¿No tiene que usar createConnection en su archivo de modelo? – alexislg

+0

No, en realidad creo que es mejor si no lo haces. Los modelos necesitan un objeto de mangosta y eso es todo lo que les importa. Mejor tener la administración de la conexión en un solo lugar e "inyectar" el objeto de la mangosta. Esta es la mejor práctica para la administración de la configuración y la reutilización del código. –

Cuestiones relacionadas