2012-09-28 11 views
10

Tengo 2 aplicaciones, cada una en una carpeta diferente y necesitan compartir los mismos modelos.¿Cómo puedo compartir modelos de mangosta entre 2 aplicaciones?

quiero enlazar simbólicamente la carpeta de los modelos de aplicación de A a una carpeta modelos de aplicación B.

estoy corriendo en problemas con el hecho de que una vez que se llama a mongoose.model ('Modelo', Esquema) en aplicación A, están 'atados' a la conexión de mangosta/mongodb de esa aplicación.

¿Alguien tiene alguna sugerencia sobre la mejor manera de gestionar esto?

+0

Cuando dices '2 aplicaciones', ¿te refieres a dos instancias de nodos separadas, cada una ejecutando una de esas aplicaciones? – JohnnyHK

+0

Sí, aplicaciones completamente separadas, pero compartirán la misma base de datos y, por lo tanto, modelos. – evilcelery

+0

Entonces no debería tener ningún problema ya que cada aplicación tendrá su propio conjunto de modelos. ¿Qué tipo de problemas has visto? – JohnnyHK

Respuesta

2

Lo que terminé haciendo aquí fue importar app1 como un submódulo (con Git) en app2. De esta forma, los modelos se pueden importar de forma normal y están vinculados a la conexión predeterminada de la aplicación mongoose.

+3

Esto suena muy interesante. ¿Puedes elaborar? –

+0

Más información aquí: https://git-scm.com/docs/git-submodule – chemitaxis

1
./shared/models/user.js 

./app1/app.js 
var user = require('../shared/user.js'); 

./app2/app.js 
var user = require('../shared/user.js'); 

No veo por qué no podría simplemente cargar los modelos desde una ruta compartida.

+1

esto no funciona para mí, la llamada al modelo está bien, ¡pero tengo consultas vacías! ¡la solución del submódulo funciona perfectamente! –

8

Tienes compartir su instancia mangosta alrededor mediante el uso de hacer algo como esto

var mongoose = require('mongoose'); 
module.exports.mongoose = mongoose; 

var user = require('./lib/user'); 

Ahora dentro de los "lib/user.js"

var mongoose = module.parent.mongoose; 
var model = mongoose.model('User', new mongoose.Schema({ ... }); 
module.exports = model; 

lo tanto haciendo como que puede requerir " lib/user.js "en otras aplicaciones

+0

Esta es una buena respuesta. Un pequeño retoque es que el archivo lib/user.js necesita referirse a mangosta usando module.parent.exports.mongoose. Lo descubrí haciendo console.log (module.parent) que muestra el gráfico del objeto del módulo padre. –

3

Mi enfoque para compartir modelos de Mongoose es pasar el objeto de mangosta como un argumento para el módulo compartido que define los esquemas y crea los modelos. Por lo que el archivo con los esquemas/modelos compartidos es el siguiente:

module.exports = function(mongoose) { 

    var packageSchema = new mongoose.Schema({ 
     title:   { type: String, required: true }, 
     description: String 
    }); 

    mongoose.model('Package', packageSchema, 'packages'); 
}; 

y luego cada proyecto que requiere en este aspecto:

var mongoose = require('mongoose'); 
var mongo_url = process.env.MONGO_CONNECTION; 
mongoose.Promise = global.Promise; 

mongoose.connect(mongo_url, connectOpts); 
require('../../../shared/models/packages')(mongoose); 
0

Si desea volver a utilizar su paquete Mangosta entre otros paquetes de la NGP, la mejor manera de hacerlo es instalar el paquete compartido en la aplicación de nivel superior y luego usarlo para inicializar los otros paquetes de NPM.

Puede utilizar este módulo NPM: https://www.npmjs.com/package/mongoose-global

0

Un enfoque consiste en abstraer el esquema en una llanura JavaScript objeto, y luego de importación que se opone a utilizar para construir los modelos dentro de sus aplicaciones.

Por ejemplo, para un 'producto' esquema:

www/app1/ProductConfig.js

const ProductConfig = { 
    name: String, 
    cost: Number 
} 
module.exports = ProductConfig; 

www/app1/ProductSchema.js

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
const ProductConfig = require('./ProductConfig'); 

const Product = new Schema(Product); 

module.exports = mongoose.model('Product', Product); 

www/app2/ProductSchema.js

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
const ProductConfig = require('../app1/ProductConfig'); 

const Product = new Schema(Product); 

module.exports = mongoose.model('Product', Product); 
Cuestiones relacionadas