2013-08-24 4 views
21

У меня есть типичный проект с Node.js - Экспресс 3 - MongoDBMissingSchemaError: Схема не была зарегистрирована для модели

Я пытаюсь сделать запрос к моей модели «Tweet» в моих/маршрутах/index.js и когда я бег мое приложение разбилось

24 Aug 11:35:07 - [nodemon] starting `node app.js` 

/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/node_modules/mongoose/lib/index.js:286 
    throw new mongoose.Error.MissingSchemaError(name); 
     ^
MissingSchemaError: Schema hasn't been registered for model "Teewt". 
Use mongoose.model(name, schema) 
at Mongoose.model (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/node_modules/mongoose/lib/index.js:286:13) 
at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/routes/index.js:6:33) 
at Module._compile (module.js:456:26) 
at Object.Module._extensions..js (module.js:474:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Module.require (module.js:364:17) 
at require (module.js:380:17) 
at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/app.js:7:14) 
at Module._compile (module.js:456:26) 
24 Aug 11:35:07 - [nodemon] app crashed - waiting for file changes before starting... 

Это часть моего app.js

var mongoose = require('mongoose'); 

mongoose.connect('mongodb://localhost/fanOcesa'); 
var Schema = mongoose.Schema; 
var ObjectID = Schema.ObjectID; 

var Teewt = new Schema({ 
    cuerpo: String 
}); 

var Teewt = mongoose.model('Teewt', Teewt); 

var app = express(); 

app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

app.get('/', routes.index); 
app.get('/users', user.list); 

и это часть моего index.js

var Teewt = require('mongoose').model('Teewt'); 

Teewt.find({}, function(err, docs){ 
    console.log('docs'); 
    console.log(docs); 
}); 

exports.index = function(req, res){ 
    res.render('index', { 
     docs: docs 
    }); 
}; 

, который будет правильным способом для выполнения этого запроса?

+2

Вы не показываете, где вы вызываете 'require', чтобы принести' index.js' в 'app.js', но если это до того, как вы зарегистрируете схему с вызовом' mongoose.model', то это ваш проблема. – JohnnyHK

+0

Файл/маршруты/index.js выразить вызовы автоматически, если я не ошибаюсь в этой строке \t 'app.get («/», routes.index);' То есть после того, как зарегистрировать схему, как вы можете видеть в коде app.js –

+0

Он не вызывается автоматически, это строка в сгенерированном коде app.js: 'var routes = require ('./ routes');' – JohnnyHK

ответ

46

Файл index.js выполняется, когда файл app.js называет:

var routes = require('./routes'); 

Так что будьте уверены, что это называют после ваши звонки зарегистрировать 'Teewt' схему как мангустов модели в app.js.

+0

Это работает идеально для меня. Thanks :) – Timbergus

+0

#feelLikeANoob! –

1

Назовите свою схему и модель по-разному. Повторное объявление Teewt - это «плохая часть» javascript, а также ошибка на любом языке программирования. Просто вызовите схему TeewtSchema и модель Teewt (так как схема обычно используется только в 1 файле в приложении, но модель может широко использоваться).

+0

Вы правы, это плохая практика и изменение имени varible, но не решает ошибку. index.js, по-видимому, запускает сначала регистрацию схемы –

+0

Да, действительно комментарий JohnnyHK, вероятно, является вашей основной причиной. –

+1

Также не ясно, что вы понимаете его комментарий. Найдите строку в 'app.js', которая выполняет' var routes = require ('routes'); 'и переместите ее ниже в файле, чтобы она появилась ПОСЛЕ настройки вашей модели mongoose. –

0

другими словами, эта линия (от app.js):

var Teewt = mongoose.model('Teewt', Teewt); 

должен быть вызван после того, как Твитнуть был зарегистрирован, на этой линии (в index.js):

var Teewt = require('mongoose').model('Teewt'); 
1

Я тоже получил эту ошибку. Был озадачен надолго, после этого и подобных нитей для помощи, пытаясь отлаживать. В конечном счете проблема оказалась из-за версии мангуста в моем случае. Я пытался использовать mongoose-fixture, чтобы засеять некоторые данные по умолчанию, чтобы начать с mongo.

Попробуйте следующее: удалить node_modules dir вашего проекта, запустите npm cache clean, а затем npm install. Если это даже не помогает, попробуйте сравнить версии mongoose/mongoose-fixture между проблемным приложением и тем, что работает, и попробуйте изменить версию в своем package.json и повторите вышеуказанные шаги. Это сработало для меня.