2012-08-23 2 views
9

Ho due schemi e voglio che interagiscano l'uno con l'altro. Ad esempio:Come creare schemi interdipendenti in Mongoose?

// calendar.js 
var mongoose = require('mongoose'); 
var Scema = mongoose.Schema; 
var Day = mongoose.model('Day'); 

var CalendarSchema = new Schema({ 
    name: { type: String, required: true }, 
    startYear: { type: Number, required: true } 
}); 

CalendarSchema.methods.getDays = function(cb){ 
    Day.find({ cal: this._id }, cb); 
} 

module.exports = mongoose.model('Calendar', CalendarSchema); 


// day.js 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 
var Calendar = mongoose.model('Calendar');  

var DaySchema = new Schema({ 
    cal: { type: ObjectId, required: true }, 
    date: { type: Number, required: true }, 
    text: { type: String, default: 'hello' } 
}); 

DaySchema.methods.getCal = function(cb){ 
    Calendar.findById(this.cal, cb); 
} 

module.exports = mongoose.model('Day', DaySchema); 

Tuttavia, viene visualizzato un errore perché ogni schema dipende dall'altro. C'è un modo per farlo funzionare usando Mongoose? Li includo in questo modo:

// app.js 
require('./models/calendar'); 
require('./models/day'); 

risposta

0

È necessario richiedere i file. Se sono nello stesso percorso di fare questo:

//calendar.js 
var Day = require('./day'); 
/* Other logic here */ 
var CalendarSchema = new Schema({ 
    name: { type: String, required: true }, 
    startYear: { type: Number, required: true } 
}) 
, Calendar; 

/* other logic here */ 
/* Export calendar Schema */ 

mongoose.model('Calendar', CalendarSchema); 
Calendar = mongoose.model('Calendar'); 
exports = Calendar; 

fare lo stesso in day.js

EDIT: Come JohnnyHK dice che questo lavoro don`t. Link to explanation

+2

Non credo che funzionerà in base all'ordine dei file richiesti, sia calendar.js che day.js vedranno solo una versione parziale dell'altro a causa della [dipendenza circolare] (http: //nodejs.org/api/modules.html#modules_cycles). – JohnnyHK

+0

Sì, mi dispiace! Non ci ho pensato ... – Donflopez

4

Mi rendo conto che questo è un thread antico, ma sono sicuro che pubblicare la soluzione aiuterà gli altri lungo la strada.

La soluzione è quella di esportare il modulo prima di richiedere gli schemi interdipendenti:

// calendar.js 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var CalendarSchema = new Schema({ 
    name: { type: String, required: true }, 
    startYear: { type: Number, required: true } 
}); 

module.exports = mongoose.model('Calendar', CalendarSchema); 

// now you can include the other model and finish definining calendar 
var Day = mongoose.require('./day');  
CalendarSchema.methods.getDays = function(cb){ 
    Day.find({ cal: this._id }, cb); 
} 


// day.js 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

var DaySchema = new Schema({ 
    cal: { type: ObjectId, required: true }, 
    date: { type: Number, required: true }, 
    text: { type: String, default: 'hello' } 
}); 

module.exports = mongoose.model('Day', DaySchema); 

// same thing here. require after exporting 
var Calendar = require('./calendar'); 

DaySchema.methods.getCal = function(cb){ 
    Calendar.findById(this.cal, cb); 
} 

E 'davvero così semplice. Spiegazione da Brian Bickerton può essere trovato qui:

http://tauzero.roughdraft.io/3948969265a2a427cf83-requiring-interdependent-node-js-modules

E 'bello essere in grado di utilizzare le funzioni per nome all'interno di un modulo al posto del lungo module.exports.name. È anche bello avere un singolo posto in cui guardare e vedere tutto da esportare. In genere, la soluzione che ho visto è quella di definire normalmente funzioni e variabili e quindi impostare module.exports su un oggetto contenente le proprietà desiderate alla fine. Questo funziona nella maggior parte dei casi. Dove si rompe è quando due moduli sono interdipendenti e si richiedono reciprocamente. L'impostazione delle esportazioni alla fine porta a risultati imprevisti. Per ovviare a questo problema, è sufficiente assegnare module.exports in alto, prima di richiedere l'altro modulo.

+0

Gesù Cristo sembra terribile. Questo non causa problemi? Sembra che tu stia esportando solo parte dello schema; e le cose qui sotto? Altre cose possono importare lo schema, anche vedere cosa c'è sotto la linea mongoose.exports? EDIT: Questo non funziona nemmeno. Si lamenta di token inaspettati che ha perfettamente senso. – djbhindi

+0

Funziona perfettamente, provalo tu stesso. Qualcuno più familiare con il nodo di me potrebbe probabilmente spiegare il perché. – mz3

+0

Ci sto provando. In un file ho: http://puu.sh/k2EsP/d938a37098.png. Nell'altro ho: http://puu.sh/k2EtB/d9f08d02f5.png. Eppure sto ancora ricevendo errori dicendo che Schema non è stato registrato per il modello "Item", nella riga corrispondente di quest'ultimo file. – djbhindi