web-dev-qa-db-fra.com

MissingSchemaError: le schéma n'a pas été enregistré pour le modèle

J'ai un projet typique avec Node.js - Express 3 - MongoDB

J'essaie de faire une requête à mon modèle 'Tweet' dans mon/routes/index.js et quand je lance l'application qui tombe en panne

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...

Cela fait partie de mes 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);

Et cela fait partie de mon 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
    });
};

quelle serait la bonne façon de faire cette requête?

21
Andres Vargas

Le fichier index.js est exécuté là où votre fichier app.js appelle:

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

Assurez-vous donc que vous appelez après pour enregistrer le schéma 'Teewt' en tant que modèle mangouste dans app.js.

50
JohnnyHK

J'ai aussi cette erreur. A été dérouté pendant longtemps, en suivant ce fil et similaires, à l'aide, en essayant de déboguer. Finalement, le problème s’est avéré être dû à la version mangouste dans mon cas. J'essayais d'utiliser mongoose-fixture pour créer des données par défaut pour commencer dans mongo. 

Essayez ceci: supprimez le répertoire node_modules de votre projet, exécutez un npm cache clean, puis un npm install. Si cela ne vous aide pas, essayez de comparer les versions de mongoose/mongoose-fixture entre l'application problématique et celle qui fonctionne, essayez de modifier la version dans votre package.json et de répéter les étapes ci-dessus. Cela a fonctionné pour moi.

1
Avik Ray

Nommez votre schéma et votre modèle différemment. Re-déclarer Teewt est une "mauvaise partie" javascript, ainsi qu'une erreur dans n'importe quel langage de programmation. Appelez simplement le schéma TeewtSchema et le modèle Teewt (car le schéma est généralement utilisé dans un seul fichier dans une application, mais le modèle peut être utilisé de manière extensive).

1
Peter Lyons

en d'autres termes, cette ligne (de app.js):

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

devrait être appelé après l'enregistrement du Tweet, sur cette ligne (dans index.js):

var Teewt = require('mongoose').model('Teewt');
0
Aviram Net