javascript – MissingSchemaError: Schema hasnt been registered for model User

javascript – MissingSchemaError: Schema hasnt been registered for model User

I got the same problem when I am trying the MEAN tutorial.

After done a little bit research, I found that in app.js, if I put require(./models/User) before var routes = require(./routes/index), then it works.

Like this:


mongoose.connect(mongodb://localhost/news);
require(./models/Posts);
require(./models/Comments);

var routes = require(./routes/index);
var users = require(./routes/users);

var app = express();

Hope the answer will be helpful!

The error occurs because the models/user.js has not been interpreted by the time router/index.js has been loaded. One way to solve this would be to do the following:

var mongoose = require(mongoose);
//Load all your models
var User = require(./../models/user.js);

//Now, this call wont fail because User has been added as a schema.
mongoose.model(User);

This, however, turns out to be against best practises, which dictates that all this config stuff should happen at the start of your app.js file. Look at this example from madhums example project

var models_path = __dirname + /app/models
fs.readdirSync(models_path).forEach(function (file) {
  if (~file.indexOf(.js)) require(models_path + / + file)
})

Note that he is loading his models before setting the apps router.
As for the Ubuntu vs Mac issue, I believe it is because a relative path in Ubuntu has to start with ./. You just have to change it to ./../models/user.js, which works on Mac.

javascript – MissingSchemaError: Schema hasnt been registered for model User

All code in your mongoose schema js files should have run before it is used in other files.

For example, the following code snippet makes sure the mongoose schema files/modules are executed.

fs.readdirSync(__dirname + /app/models).forEach(function (file) {
if (~file.indexOf(.js)) require(__dirname + /app/models/ + file); });

or schema files can be manually executed by calling

var User = require(./app/models/user.js)

before the models are used anywhere in the application.

Once the above is done, other modules that uses mongoose models can be required/executed.

Leave a Reply

Your email address will not be published.