Подтвердить что ты не робот

MissingSchemaError: схема не была зарегистрирована для модели

У меня есть типичный проект с Node.js - Express 3 - MongoDB

Я пытаюсь сделать запрос к моей модели "Tweet" в моем /routes/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
    });
};

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Другими словами, эта строка (из приложения .js):

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

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

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