node.js - Mongoose model architecture and Node require order
问题描述
I am having a problem understanding how I should structure my Mongoose model files so I don't have issues with dependencies when I require them. I have a lot of model files and when I require one model file in another to use as a reference type, I run into errors if I don't require the model files in order. What should I do different architecturally if I can't load them in a linear order because dependencies go up and down the list of model files? Do I just have to juggle them down the line and hope I don't paint myself into a corner or am I doing this wrong?
app.js - top of my app
const path = require('path');
const bodyParser = require("body-parser");
const mongoose = require('mongoose');
const express = require('express');
require('./models/task');
require('./models/taskstory');
require('./models/majortask');
require('./models/majortaskinstance');
require('./models/client');
require('./models/discipline');
require('./models/disciplineinstance');
require('./models/estimate');
require('./models/project');
require('./models/user');
const taskstoryRoutes = require('./routes/taskstory');
const majortaskRoutes = require('./routes/majortask');
const taskRoutes = require('./routes/task');
const userRoutes = require("./routes/user");
const clientRoutes = require("./routes/client");
const projectRoutes = require("./routes/project");
const estimateRoutes = require('./routes/estimate');
const disciplineRoutes = require('./routes/discipline');
const app = express();
And an example model... estimate.js
const mongoose = require('mongoose');
const disciplineinstanceschema = require('mongoose').model('disciplineInstance').schema;
var ObjectId = require('mongoose').Types.ObjectId;
const estimateScheme = mongoose.Schema({
estimatename: { type: String, required: true, unique: true },
summarytext: { type: String },
scopetext: { type: String },
disciplines:{type: [disciplineinstanceschema], sparse:true}
});
module.exports = mongoose.model('Estimate', estimateScheme);
解决方案
it's better to import models in your route files and import each model dependencies in its file like this:
// models/disciplineInstance.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const disciplineInstanceSchema = new Schema({
// some things
});
module.exports.disciplineInstanceSchema = disciplineInstanceSchema; // schema
module.exports.DisciplineInstance = mongoose.model('DisciplineInstance', disciplineInstanceSchema); // model
// models/estimate.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const {DisciplineInstanceSchema} = require('models/disciplineInstance.js');
const estimateScheme = new Schema({
estimatename: { type: String, required: true, unique: true },
summarytext: { type: String },
scopetext: { type: String },
disciplinesByRef:{ // by reference model design
type: Schema.Types.ObjectId,
ref: 'DisciplineInstance' // this is a collection/model name
},
disciplinesEmbedded: { // embedded model design
type: DisciplineInstanceSchema
}
});
module.exports = mongoose.model('Estimate', estimateScheme);
- for more info about
embedded design
vsreference design
see mongodb documents.
推荐阅读
- javascript - safari input type='number' 无法显示真实值
- javascript - 当数据更改时,饼图中的切片大小保持不变(版本=本帖的当前版本)
- python-2.7 - 我如何使 Tkinker 小部件忽略其上方行中小部件的宽度(并且只是浮动到左侧)?
- ssis - 在 SSIS 中计算给定日期的每周倒计时
- java - 如何在所有 apache 请求中保留原始 IP 地址
- javascript - 如何搜索邮政编码和城市谷歌地图
- sql - Arel 连接子查询
- javascript - 如何使用 javascript 在 JSON 文件中编写单个反斜杠?
- python - 将多索引/多级数据帧减少为单索引、单级
- r - 使用 rvest 在 R 中进行 Web 抓取以提取表数据