2013-11-23 2 views
1

я получаю сообщение об ошибке, как это, это StackTrace линии, от начала:MissingSchemaError: Схема не была зарегистрирована для модели, mongoose.model вызывается перед схемой

это мой основной файловый сервер узла, где загрузить маршруты

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'); 

И это работает правильно, но это точно такой же порядок мой.

+0

В какой-то момент необходимо потребовать файл модели Todo, прежде чем пытаться назначить mongoose.model ('Todo') –

ответ

2

В файле server.js (https://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. Это должно было произойти до ваших контроллеров, которые имеют ссылки на типы моделей.

+1

Gahh, я просматривал файл server.js, видел этот метод, но казался слишком сложным, чтобы просто создавать схемы, поэтому пропустили его. Является ли это стандартным способом сделать это или более как «хаки»? – Jaanus

+0

Я закодировал то же самое - и я не стал бы считать его взломанным. Это довольно типичный способ загрузки загрузочной папки с файлами в NodeJS. Вы можете сделать это вручную, индивидуально загрузив с помощью 'require' для каждого файла, но это гораздо более устойчиво для изменения. – WiredPrairie

+0

@WiredPrairie Это то, что используется в бутстрапе mean.io. Это так уродливо. – theblang

Смежные вопросы