首页 > 解决方案 > 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);

标签: node.jsexpressmongoosemodel

解决方案


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 vs reference design see mongodb documents.

推荐阅读