web-dev-qa-db-fra.com

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

Dans mon fichier models/user.js:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
    (define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);

Et dans mon router/index.js, j'ai:

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

qui jette l'erreur:

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

Si toutefois, dans user.js, je le fais (à la dernière ligne)

module.exports = mongoose.model('User', userSchema);

et dans index.js je fais var User = require('../models/User');, alors tout fonctionne.

Mais cela ne devrait pas, parce que dans config/pass.js je fais var User = mongoose.model('User'); et cela fonctionne parfaitement.

La syntaxe require('../models/User'); ne fonctionne pas sur Ubuntu, mais sur mon Mac.

Que devrais-je faire? Comment je le répare? J'ai consulté de nombreux exemples d'applications, y compris MEAN mais rien n'a été vraiment utile.

36
Karan Goel

J'ai eu le même problème lorsque j'essaie le tutoriel MEAN. 

Après avoir effectué quelques recherches, j’ai trouvé que dans app.js, si je mettais require ("./ models/User") avant var routes = require ("./ routes/index"), alors cela fonctionne. 

Comme ça:


mongoose.connect("mongodb://localhost/news");
require("./models/Posts");
require("./models/Comments");

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

var app = express();

J'espère que la réponse vous sera utile!

48
Ahei Cheng

L'erreur se produit car le models/user.js n'a pas été interprété par le moment où router/index.js a été chargé. Une façon de résoudre ce problème serait de procéder comme suit:

var mongoose = require('mongoose');
//Load all your models
var User = require('./../models/user.js');

//Now, this call won't fail because User has been added as a schema.
mongoose.model('User');

Toutefois, cela s’avère contraire aux meilleures pratiques, ce qui impose que tout ce travail de configuration se produise au début de votre fichier app.js. Regardez cet exemple du projet exemple de madhums

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

Notez qu'il charge ses modèles avant de configurer le routeur de l'application . Quant au problème Ubuntu vs Mac, je pense que c'est parce qu'un chemin relatif dans Ubuntu doit commencer par ./. Vous devez juste le changer en ./../models/user.js, qui fonctionne sur Mac.

34
verybadalloc

Tout le code de vos fichiers js de schéma mongoose doit avoir été exécuté avant d’être utilisé dans d’autres fichiers.

Par exemple, l'extrait de code suivant permet de s'assurer que les fichiers/modules de schéma mongoose sont exécutés.

fs.readdirSync (__ dirname + '/app/models').forEach(function (file) { if (~ fichier.indexOf (' .js ')) nécessite (__ dirname +'/app/models/'+ fichier );});

ou des fichiers de schéma peuvent être exécutés manuellement en appelant 

var User = require ('./ app/models/user.js')

avant que les modèles ne soient utilisés n’importe où dans l’application.

Une fois ce qui précède terminé, d’autres modules utilisant des modèles mangouste peuvent être requis/exécutés.

9
Rajkumar Nagarajan

Ce problème s'est produit lors de la tentative d'obtention du modèle avant de charger le fichier de modèle

J'ai résolu le même problème dans mon mean.io projet

Dans le contrôleur:

'use strict';
require('../models/settingsModel'); // load settingsModel.js file before get mongoose.model('Settings')
var mongoose = require('mongoose'),
    Settings = mongoose.model('Settings'),
    Q = require('q');
6
Shaishab Roy

En utilisant express, une des erreurs courantes est de demander express avant mangouste. Cela aboutit à "MissingSchemaError: le schéma n'a pas été enregistré pour le modèle" Utilisateur "." Erreur.

Vous pouvez facilement résoudre le problème en corrigeant l'ordre "requis" (c'est-à-dire mangouste puis exprès)

var mongoose = require('./config/mongoose'), 
    express = require('./config/express');
2
Wreeecks

J'ai eu cette erreur en essayant d'utiliser mongoose-fixture pour ensemencer des données par défaut dans une collection Mongo. A été dérouté pendant longtemps, en suivant ce fil et similaires, à l'aide, en essayant de déboguer. En fin de compte, le problème s’est révélé être dû aux versions mongoose et mongoose-fixture dans mon cas. 

Si aucun code ne modifie l'aide, ou si vous obtenez cette erreur en essayant d'utiliser correctement mongoose-fixture (qui est supposé enregistrer vos schémas pour vous), 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

J'ai rencontré ce problème lorsque j'ai essayé d'ajouter un nouveau modèle sur le code de base de ce tutoriel User Auth on MEAN stack . La solution est comme ce que Ahei a mentionné.

Plus précisément, je dois ajouter une ligne require('path/to/your/model') à la fin de /app_api/models/db.js qui est requise dans le app.js. Il est préférable de conserver la cohérence de la structure pour faciliter le développement.

0
peteroid

Je suis récemment tombé sur une solution similaire aux réponses fournies par @ rajkumar-nagarajan et @verybadalloc.

J'aime mieux cette approche, car elle évite l'itération n + 1 et ne lit pas tous les modèles à partir du système de fichiers.

Dans app/models/index.js, demandez à chaque fichier de modèle:

require('./model1');
require('./model2');
require('./model3');

Ensuite, dans /app.js ou /index.js (selon votre projet), vous pouvez maintenant faire simplement:

require('./app/models');

La partie qui me manque (des conseils appréciés ici) - comment enregistrer facilement chaque modèle par son nom, par exemple

mongoose.model('Model1')
0
theUtherSide

J'ai également rencontré cette erreur avec ES6/TypeScript. Même si j'ai importé le modèle, l'erreur a persisté. Selon docs ici

MongooseError.MissingSchemaError

Lancé lorsque vous essayez d'accéder à un modèle qui n'a pas encore été enregistré

    import { model, Schema } from 'mongoose';
    import Company from './CompanyModel';

    const ProjectSchema = new Schema({
        company: { type: Schema.Types.ObjectId, ref: "Company" }
    });

    export default model('Project', ProjectSchema);

Les astuces étaient juste pour vous assurer d'utiliser le modèle de manière explicite, donc changer ref:"Company" en ref:Company.modelName semblait résolu.

J'espère que ça aide certains d'entre vous

0
irzhy