2015-02-12 2 views
0

Как правильно ссылаться на другую схему?MissingSchemaError: Schema не зарегистрировано для модели

Ошибка:

MissingSchemaError: Schema hasn't been registered for model "CategorySub". 

Модель файла:

// module dependencies 
var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 
    , CategoryMain = mongoose.model('CategoryMain') 
    , CategorySub = mongoose.model('CategorySub'); 


// set up the schema 
var CategoryProductSchema = new Schema({ 
    name: { type: String }, 
    _category_main : [CategoryMainSchema], 
    _category_sub : [CategorySubSchema] 

}, 
{ 
    collection: 'categories_product' 
} 
) 

// before save function equivalent 
CategoryProductSchema.pre('save', function(next){ 
    var now = new Date(); 
    this.updated_at = now; 
    if (!this.created_at) { 
    this.created_at = now; 
    } 
    next(); 
}) 

CategoryProductSchema.set('toObject', { getters: true }); 

mongoose.model('CategoryProduct', CategoryProductSchema); 

EDIT

Это небольшой проект, который я взял на себя, и я новичок в MongoDB/Mongoose. Я нашел это в app.js от предыдущего владельца:

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

Он просто проходит через папку и регистрирует каждую схему по одному. Однако в папке моя дочерняя схема находится перед моей родительской схемой, поэтому она сначала регистрируется.

Я добавил models.js файлов, который выглядит так:

var models = ['token.js', 
'user.js', 
'category_main.js', 
'category_sub.js', 
'category_product.js', 
'product.js' 
]; 
exports.initialize = function() { 
    var l = models.length; 
    for (var i = 0; i < l; i++) { 
     require(models[i]); 
    } 
}; 

А затем заменить исходный код в app.js для вызова требуется это новые модели файла следующим образом:

require('./models/models.js').initialize(); 

меня эта идея из одного из ответов в этом популярном вопросе:

mongoose schema creation

Однако теперь я получаю ReferenceError: CategoryMainSchema is not defined, исходя из моего файла модели category_sub.js.

Это не MissingSchemaError, однако.

+0

Я думаю, что его необходимо определить схемы first- forCategoryMainSchema и CategorySubSchema, либо выше, либо ссылку на то, где они уже определены. –

ответ

0

Ваша схема не определена на случай. Ваши модели.js и app.js просто проходят через каждую из моделей, которые вы определили. Это отличается от наличия видимости CategorySubSchema в файле модели CategoryProduct.

В NodeJS указанная вами схема и модель не будут находиться в глобальном масштабе. Проблема, с которой вы сталкиваетесь, - это проблема охвата, поскольку вы предполагаете, что схемы видны глобально. Вам придется экспортировать их для других функций, чтобы увидеть их.

Пожалуйста, ссылку на nodejs ссылку module_export здесь: http://nodejs.org/api/modules.html#modules_module_exports

В вашем случае, вы, вероятно, нужно изменить свой код к следующим в вашем файле модели:

exports.CategoryMainSchema = CategoryMainSchema; 

и так далее в каждом файле модели , Затем в файлы модели, которые вы хотите использовать их в качестве подсхем, вы можете потребовать, чтобы модели, как:

var CategoryMainSchema = require('CategoryMain').CategoryMainSchema //assuming CategoryMain is the name of your model file 

Синтаксис может быть немного прочь, но, пожалуйста, дайте ему попробовать. Благодарю.

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