简体   繁体   中英

Mongoose: Linked Model Schema “Hasn't Been Registered for Model”

Currently using Mongoose with MongoDB for an Express server, however I attempted to link up several Mongoose models together and I am getting

MissingSchemaError: Schema hasn't been registered for model "Semester".
Use mongoose.model(name, schema)

with my execution.

The current project structure is as follows

app.js
www.js
models
|-- member.js
|-- semester.js
routes
|-- members.js

I've reviewed about two dozen other Stackoverflow questions regarding the same error and all of which pointed at using require for the model(s) before require('express') .

However, I am currently following that practice but still getting an unrecognized Schema (which leads me to believe that how I linked the models together was incorrect).

app.js

// DEPENDENCIES
var bodyParser = require('body-parser');
var mongoose = require('mongoose'); // NOTE: Mongoose needs to be required before express

// MODELS   
require('./models/member');
require('./models/semester');

// ROUTES
var members = require('./routes/members'); // NOTE: Routes need to be required before express as well

var express = require('express');
var app = express();

// ... More Stuff ...

module.exports = app;

My ./routes/members.js

var Member = require('../app/models/member');
require('../app/models/semester');
var express = require('express');

var router = express.Router();

// ... Logic is here ...

module.exports = router;

Finally the models themselves member.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Semester = require('mongoose').model('Semester').schema;
// Would var Semester = mongoose.model('Semester').schema also work?

var MemberSchema = new Schema({
  name: {
    first: {type: String, default: ''},
    last: {type: String, default: ''}
  },
  studentID: {type: Number, default: 0},
  email: {type: String, default: ''},
  social: {type: Social},
  semesters: [Semester],
  currenPosition: {type: String, default: ''}
});
module.exports = mongoose.model('Member', MemberSchema);

semester.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Event = require('mongoose').model('Event').schema; // These are valid models, but I haven't included them in the scope of this question
var Project = require('mongoose').model('Project').schema;

// Object which describes a singular semester
var SemesterSchema  = new Schema({
  term: {type: String, default: ''},
  year: {type: Number, default: ''},
  position: {type: String, default: ''}
  events: [Event],
  projects: [Project]
});

module.exports = mongoose.model('Semester', SemesterSchema);

I am rather certain at this point that it's a non-mongoose related mistake I made when requiring and linking different models together.

This error could be happening because you're requiring Member model before Semester in app.js , this is because Semester model and schema not exist when './models/member' is required

Try to change the order in app.js to:

// MODELS   
require('./models/semester');
require('./models/member');

To avoid this situation you could require the model from the script file ('./models/semester') instead of obtaining it from mongoose through model in the script file were Member model is declared ( ./models/member )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM