我有两个模式,我希望他们互相交流。例如:
// 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 :(得分: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);
}
真的很简单。 Brian Bickerton的解释可以在这里找到:
http://tauzero.roughdraft.io/3948969265a2a427cf83-requiring-interdependent-node-js-modules
能够在模块中使用名称而不是冗长的module.exports.name是很好的。有一个地方可以查看并查看要导出的所有内容,这也很不错。通常,我看到的解决方案是正常定义函数和变量,然后将module.exports设置为包含最终所需属性的对象。这适用于大多数情况。它崩溃的地方是两个模块相互依赖并相互要求。最后设置导出会导致意外结果。要解决此问题,只需在顶部指定module.exports,然后再需要其他模块。
答案 1 :(得分: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所说,这不起作用。 Link to explanation