2012-08-23 11 views
9

Mam dwa schematy i chcę, aby ze sobą współpracowały. Na przykład:Jak tworzyć współzależne schematy w 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); 

Jednak pojawia się błąd, ponieważ każdy schemat zależy od drugiego. Czy istnieje sposób, aby to działało, używając Mongoose? Dołączam je w ten sposób:

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

Odpowiedz

0

Potrzebujesz plików. Jeśli są one w tej samej ścieżce to zrobić:

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

Zrób to samo w day.js

EDIT: Jak JohnnyHK mówi ta praca Don`t. Link to explanation

+2

Nie sądzę, że będzie to działać w zależności od kolejności wymaganych plików, albo calendar.js lub day.js będzie widzieć tylko częściową wersję drugiej z powodu [zależności cyklicznej] (http: //nodejs.org/api/modules.html#modules_cycles). – JohnnyHK

+0

Tak, przepraszam! Nie myślałem o tym ... – Donflopez

4

Zdaję sobie sprawę, że jest to starożytna nitka, ale jestem pewien, że opublikowanie rozwiązania pomoże innym w drodze.

Rozwiązaniem jest wyeksportować moduł przed wymagając współzależne schematów:

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

To naprawdę jest takie proste. Objaśnienie Brian Bickerton można znaleźć tutaj:

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

Miło jest móc korzystać z funkcji nazwy w module zamiast długiego module.exports.name. Miło jest też mieć jedno miejsce do patrzenia i zobaczyć wszystko do wyeksportowania. Zazwyczaj rozwiązaniem, które widziałem, jest normalne definiowanie funkcji i zmiennych, a następnie ustawienie funkcji module.exports na obiekcie zawierającym pożądane właściwości na końcu. Działa to w większości przypadków. Tam, gdzie się zepsuje, jest, gdy dwa moduły są wzajemnie zależne i wymagają siebie nawzajem. Ustawienie eksportu na końcu prowadzi do nieoczekiwanych wyników. Aby obejść ten problem, po prostu przypisz moduł.exports na górze, zanim zażądasz drugiego modułu.

+0

Jezus Chrystus to wygląda okropnie. To nie sprawia żadnych problemów? Wygląda na to, że eksportujesz tylko część schematu; co z poniższymi rzeczami? Czy inne rzeczy mogą importować schemat, nawet zobaczyć, co jest pod linią mongoose.exports? EDYCJA: To nawet nie działa. Narzeka na nieoczekiwane tokeny, co ma sens. – djbhindi

+0

Działa idealnie, spróbuj sam. Ktoś bardziej obeznany z węzłem niż ja mógł prawdopodobnie wyjaśnić dlaczego. – mz3

+0

Próbuję go. W jednym pliku mam: http://puu.sh/k2EsP/d938a37098.png. W drugim mam: http://puu.sh/k2EtB/d9f08d02f5.png. A jednak wciąż dostaję błędy mówiąc, że Schema nie został zarejestrowany dla modelu "Pozycja", w odpowiednim wierszu tego ostatniego pliku. – djbhindi