MissingSchemaError:尚未为模型注册模式,mongoose.model在模式之前调用

时间:2013-11-23 22:03:54

标签: node.js mongodb express

我得到这样的错误,这些是stacktrace行,从开始:

这是我的主节点服务器文件,我在其中加载路由

require('./config/routes')(app); 

这是路径文件,需要

var todos = require('../app/controllers/todos'); controller

这是控制器,它在第2行提供错误:

var mongoose = require('mongoose'),
Todo = mongoose.model('Todo'),
_ = require('underscore');

这是我的模型文件,似乎没有被调用:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var TodoSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    content: {
        type: String,
        default: '',
        trim: true
    }
});

TodoSchema.path("content").validate(function(content) {
    return content.length;
}, 'Content cannot be blank');

mongoose.model("Todo", TodoSchema);

因此,如果我理解正确,我的问题是这行(内部控制器)被调用:

Todo = mongoose.model('Todo')

在此行之前,在我的模型中:

mongoose.model("Todo", TodoSchema);

右?然而,我从mean.io和其他一些人那里拿走了这个堆栈,并把它放在一起。

让我们看看mean.io代码,他们正在做同样的事情:

server.js

require('./config/routes')(app, passport, auth);

然后进入routes.js和代码:

var articles = require('../app/controllers/articles');

然后进入文章控制器:

var mongoose = require('mongoose'),
Article = mongoose.model('Article'),
_ = require('underscore');

这是正常的,但它与我的命令完全相同。

1 个答案:

答案 0 :(得分:2)

在文件server.jshttps://github.com/linnovate/mean/blob/master/server.js)中,有一个函数被调用来自动加载模型:

//Bootstrap models
var models_path = __dirname + '/app/models';

var walk = function(path) {
    fs.readdirSync(path).forEach(function(file) {
        var newPath = path + '/' + file;
        var stat = fs.statSync(newPath);
        if (stat.isFile()) {
            if (/(.*)\.(js$|coffee$)/.test(file)) {
                require(newPath);
            }
        } else if (stat.isDirectory()) {
            walk(newPath);
        }
    });
};
walk(models_path);

这将加载/app/models目录中定义的所有模型。这需要在之前发生您的控制器,这些控制器引用了模型类型。