2012-08-23 22 views
9

私は2つのスキーマを持っていて、それらを相互にやりとりしたいのです。たとえば、次のようになります。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); 

ただし、それぞれのスキーマは他のスキーマに依存するため、エラーが発生します。 Mongooseを使ってこれを動作させる方法はありますか?

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

EDITで同じ操作を行います: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内の名前で関数を使用することができてうれしいです。また、エクスポートするすべてのものを見たり、見ることができる単一の場所を持つことも良いことです。通常、私が見た解決策は、関数と変数を通常は定義し、最後にmodule.exportsを目的のプロパティを含むオブジェクトに設定することです。これはほとんどの場合に有効です。故障が発生するのは、2つのモジュールが相互に依存し、互いに必要な場合です。最後にエクスポートを設定すると、予期しない結果につながります。この問題を回避するには、他のモジュールを要求する前に、一番上にmodule.exportsを割り当てます。

+0

イエスキリストこれはひどいようです。これは何の問題も生じませんか?あなたがスキーマの一部だけをエクスポートしているようです。下のものはどうですか? mongoose.exportsの下にあるものを見ても、他のものがスキーマをインポートできますか? 編集:これは機能しません。完璧な意味を持つ予期しないトークンについて不平を言う。 – djbhindi

+0

それは完璧に動作し、自分自身を試してみてください。自分よりもノードに精通している人が、なぜその理由を説明できるのでしょうか。 – mz3

+0

私はそれを試しています。あるファイルで私は持っている:http://puu.sh/k2EsP/d938a37098.png。他の私は持っている:http://puu.sh/k2EtB/d9f08d02f5.png。 まだ、スキーマがモデル "Item"に登録されていないというエラーが表示されています。後者のファイルの対応する行にあります。 – djbhindi

関連する問題