2012-08-23 20 views
9

मेरे पास दो स्कीमा हैं और मैं चाहता हूं कि वे एक-दूसरे से बातचीत करें। उदाहरण के लिए:मोंगोस में परस्पर निर्भर स्कीमा कैसे बनाएं?

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

हालांकि, मुझे एक त्रुटि मिलती है क्योंकि प्रत्येक स्कीमा दूसरे पर निर्भर करती है। क्या मोंगोस का उपयोग करके यह काम करने का कोई तरीका है? मैं उन्हें इस तरह शामिल करता हूं:

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

उत्तर

0

आपको फ़ाइलों की आवश्यकता है। वे एक ही पथ में हैं, तो ऐसा करते हैं:

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

day.js में

संपादित एक ही कार्य करें: JohnnyHK इस डॉन `t काम कहते हैं। Link to explanation

+2

मुझे नहीं लगता कि यह आपकी आवश्यक फ़ाइलों के क्रम के आधार पर काम करेगा, या तो calendar.js या day.js केवल [परिपत्र निर्भरता] के कारण दूसरे का आंशिक संस्करण देखेंगे (http: //nodejs.org/api/modules.html#modules_cycles)। – JohnnyHK

+0

हाँ, क्षमा करें! मैंने इसके बारे में सोचा नहीं है ... – Donflopez

4

मुझे एहसास है कि यह एक प्राचीन धागा है, लेकिन मुझे यकीन है कि समाधान पोस्ट करने से दूसरों को सड़क के नीचे मदद मिलेगी।

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

यह वास्तव में है कि सरल है:

समाधान अन्योन्याश्रित स्कीमा की आवश्यकता से पहले मॉड्यूल निर्यात करने के लिए है। ब्रायन Bickerton द्वारा स्पष्टीकरण यहां पाया जा सकता:

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

यह एक मॉड्यूल के बजाय लंबा module.exports.name भीतर नाम से कार्यों का उपयोग करने में सक्षम होना अच्छा है। निर्यात करने के लिए सबकुछ देखने और देखने के लिए एक ही जगह रखना भी अच्छा है। आम तौर पर, मैंने जो समाधान देखा है वह सामान्य रूप से कार्यों और चर को परिभाषित करना है और फिर अंत में वांछित गुण वाले ऑब्जेक्ट में मॉड्यूल.एक्सपोर्ट सेट करना है। यह ज्यादातर मामलों में काम करता है। जहां यह टूट जाता है वह तब होता है जब दो मॉड्यूल अंतर-निर्भर होते हैं और एक-दूसरे की आवश्यकता होती है। अंत में निर्यात की स्थापना अप्रत्याशित परिणामों की ओर ले जाती है। इस समस्या को हल करने के लिए, अन्य मॉड्यूल की आवश्यकता से पहले, शीर्ष पर मॉड्यूल.एक्सपोर्ट असाइन करें।

+0

यीशु मसीह यह भयानक लगता है। इससे कोई समस्या नहीं आती है? ऐसा लगता है कि आप स्कीमा का केवल एक हिस्सा निर्यात कर रहे हैं; नीचे सामान के बारे में क्या? क्या अन्य सामान स्कीमा आयात कर सकते हैं यह भी देख सकते हैं कि mongoose.exports लाइन के अंतर्गत क्या है? संपादित करें: यह भी काम नहीं करता है। अप्रत्याशित टोकन के बारे में शिकायत करता है जो सही समझ में आता है। – djbhindi

+0

यह पूरी तरह से काम करता है, इसे स्वयं आज़माएं। मेरे से नोड से अधिक परिचित कोई शायद शायद क्यों समझा सकता है। – mz3

+0

मैं इसे आजमा रहा हूं। एक फ़ाइल में मेरे पास है: http://puu.sh/k2EsP/d938a37098.png। दूसरे में मेरे पास है: http://puu.sh/k2EtB/d9f08d02f5.png। और फिर भी मुझे अभी भी त्रुटियां मिल रही हैं कि स्कीमा बाद की फ़ाइल की इसी पंक्ति में मॉडल "आइटम" के लिए पंजीकृत नहीं है। – djbhindi

संबंधित मुद्दे