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.
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!
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.
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.
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');
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');
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.
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.
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')
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