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 won’t 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 app’s 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.