2012-08-23 29 views
9

Tôi có hai Schemas và tôi muốn chúng tương tác với nhau. Ví dụ:Làm thế nào để tạo các lược đồ phụ thuộc lẫn nhau trong 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); 

Tuy nhiên, tôi gặp lỗi vì mỗi lược đồ phụ thuộc vào một lược đồ khác. Có cách nào để làm việc này bằng Mongoose không? Tôi bao gồm chúng như sau:

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

Trả lời

0

Bạn cần yêu cầu tệp. Nếu họ đang ở trong cùng một con đường thực hiện điều này:

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

Làm tương tự trong day.js

EDIT: Như JohnnyHK nói công việc don `t này. Link to explanation

+2

Tôi không nghĩ rằng nó sẽ hoạt động tùy thuộc vào thứ tự các tệp yêu cầu của bạn, calendar.js hoặc day.js sẽ chỉ thấy phiên bản một phần của phiên bản khác vì [phụ thuộc vòng tròn] (http: //nodejs.org/api/modules.html#modules_cycles). – JohnnyHK

+0

Có, xin lỗi! Tôi đã không nghĩ về điều đó ... – Donflopez

4

Tôi nhận thấy đây là một chủ đề cũ, nhưng tôi chắc chắn rằng việc đăng giải pháp sẽ giúp những người khác trên đường.

Giải pháp là để xuất khẩu các module trước khi đòi hỏi các lược đồ phụ thuộc lẫn nhau:

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

Nó thực sự là đơn giản. Giải thích bởi Brian Bickerton có thể được tìm thấy ở đây:

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

Thật tuyệt khi có thể sử dụng chức năng theo tên trong một module thay cho module.exports.name dài. Nó cũng tốt đẹp để có một nơi duy nhất để xem và xem tất cả mọi thứ được xuất khẩu. Thông thường, giải pháp mà tôi đã thấy là định nghĩa các hàm và các biến thông thường và sau đó đặt module.exports thành một đối tượng có chứa các thuộc tính mong muốn ở cuối. Điều này làm việc trong hầu hết các trường hợp. Trường hợp nó bị hỏng là khi hai mô-đun phụ thuộc lẫn nhau và yêu cầu lẫn nhau. Việc đặt xuất ở cuối sẽ dẫn đến kết quả không mong muốn. Để giải quyết vấn đề này, chỉ cần chỉ định module.exports ở trên cùng, trước khi yêu cầu mô đun khác.

+0

Chúa Giêsu Kitô điều này có vẻ khủng khiếp. Điều này không gây ra bất kỳ vấn đề gì? Có vẻ như bạn chỉ xuất một phần của lược đồ; những gì về những thứ dưới đây? Các công cụ khác có thể nhập giản đồ ngay cả khi nhìn thấy những gì dưới dòng mongoose.exports không? CHỈNH SỬA: Tính năng này thậm chí không hoạt động. Khiếu nại về các thẻ không mong muốn có ý nghĩa hoàn hảo. – djbhindi

+0

Nó hoạt động hoàn hảo, hãy thử một mình. Một người nào đó quen thuộc hơn với nút hơn bản thân tôi có lẽ có thể giải thích lý do tại sao. – mz3

+0

Tôi đang thử. Trong một tệp tôi có: http://puu.sh/k2EsP/d938a37098.png. Mặt khác tôi có: http://puu.sh/k2EtB/d9f08d02f5.png. Và tôi vẫn nhận được lỗi nói rằng Schema chưa được đăng ký cho mô hình "Mục", trong dòng tương ứng của tệp thứ hai. – djbhindi

Các vấn đề liên quan