2012-09-28 22 views
10

Ho 2 app, ognuna in una cartella diversa e hanno bisogno di condividere gli stessi modelli.Come posso condividere i modelli di mangusta tra 2 app?

voglio link simbolico alla cartella modelli da App A a una cartella modelli in App B.

sto correndo in problemi con il fatto che una volta che si chiama mongoose.model ('Modello', Schema) in l'app A, sono "legate" alla connessione mongoose/mongodb di quell'app.

Qualcuno ha qualche consiglio sul modo migliore per gestirlo?

+0

Quando dici "2 app", intendi due istanze di nodo distinte, ognuna delle quali esegue una di quelle app? – JohnnyHK

+0

Sì, app completamente separate ma condivideranno lo stesso database e quindi i modelli. – evilcelery

+0

Quindi non dovresti avere problemi poiché ogni app avrà il proprio set di modelli. Che tipo di problemi hai visto? – JohnnyHK

risposta

2

Quello che ho finito qui era importare app1 come sottomodulo (con Git) in app2. In questo modo i modelli possono essere importati normalmente e sono legati alla connessione predefinita mongoose dell'app.

+3

Sembra molto interessante. Puoi elaborare? –

+0

Maggiori informazioni qui: 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'); 

Non vedo perché non è stato possibile caricare i modelli da un percorso condiviso.

+1

questo non funziona per me, la chiamata alla modella va bene ma ho delle domande vuote! la soluzione del sottomodulo funziona perfettamente! –

8

Si devono condividere l'istanza mangusta intorno utilizzando facendo qualcosa di simile

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

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

Ora all'interno di "lib/user.js"

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

Così facendo così si può richiedere " lib/user.js "in altre applicazioni

+0

Questa è una buona risposta. Un piccolo aggiustamento è che il file lib/user.js deve fare riferimento a mangusta usando module.parent.exports.mongoose. Ho capito questo facendo console.log (module.parent) che mostra il grafico dell'oggetto modulo genitore. –

3

Il mio approccio alla condivisione dei modelli Mongoose è di passare l'oggetto mangusta come argomento al modulo condiviso che definisce gli schemi e crea i modelli. Quindi il file con i comuni schemi/modelli assomiglia a questo:

module.exports = function(mongoose) { 

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

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

e quindi ogni progetto richiede loro in questo modo:

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

Se si desidera riutilizzare il pacchetto Mongoose tra altri pacchetti NPM, il modo migliore per farlo è installare il pacchetto condiviso nell'app di livello superiore e quindi utilizzarlo per inizializzare gli altri pacchetti NPM.

È possibile utilizzare questo modulo NPM: https://www.npmjs.com/package/mongoose-global

0

Un approccio è quello di astrarre lo schema in una pianura oggetto JavaScript, e quindi di importazione che oggetto da utilizzare per la costruzione dei modelli entro le tue applicazioni.

Per esempio, per un 'prodotto' schema:

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); 
Problemi correlati