J'apprends la pile moyenne et quand j'essaie de démarrer le serveur en utilisant
npm start
Je reçois une exception disant que:
schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)
voici mon code dans /models/Posts.js
var mongoose = require('mongoose');
var PostSchema = new mongoose.Schema({
title: String,
link: String,
upvotes: { type: Number, default: 0 },
comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});
mongoose.model('Post', PostSchema);
comme je peux le voir, le schéma devrait être enregistré pour le modèle 'Post', mais qu'est-ce qui peut éventuellement provoquer la levée de l'exception?
Merci d'avance.
Modifier: Voici l'erreur d'exception
/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
throw new mongoose.Error.MissingSchemaError(name);
^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)
et voici le code app.js avec l'initialisation mangouste:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');
avant la ligne:
app.use('/', routes);
Ce n'est pas un problème avec l'exportation de modèle. J'ai eu le même problème.
Le vrai problème est qu'il faut des déclarations pour les modèles
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');
étaient en dessous des dépendances des routes. Il suffit de déplacer les dépendances mongoDB au-dessus des dépendances des routes. Voici à quoi cela devrait ressembler:
// MongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
Si quelqu'un ne peut pas résoudre le problème avec l'approche de la bonne réponse (comme moi), essayez de regarder la création du schéma. J'ai écrit le 'ref' en tant que 'User', mais le correct était 'user'.
Faux:
createdBy: {
type: Schema.Types.ObjectId,
ref: 'User'
}
Correct:
createdBy: {
type: Schema.Types.ObjectId,
ref: 'user'
}
SI VOUS UTILISEZ PLUSIEURS CONNEXIONS mongoDB
attention, lorsque vous utilisez .populate (), vous DEVEZ fournir le modèle, car mangouste ne "trouvera" que des modèles sur la même connexion .
var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
"name": String,
"email": String
});
var customerSchema = mongoose.Schema({
"name" : { type: String },
"email" : [ String ],
"created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});
var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);
Correct:
Customer.findOne({}).populate('created_by', 'name email', User)
ou
Customer.findOne({}).populate({ path: 'created_by', model: User })
Incorrect (produit l'erreur "Le schéma n'a pas été enregistré pour le modèle"):
Customer.findOne({}).populate('created_by');
J'ai utilisé l'approche suivante pour résoudre le problème
const mongoose = require('mongoose');
const Comment = require('./comment');
const PostSchema = new mongoose.Schema({
title: String,
link: String,
upvotes: { type: Number, default: 0 },
comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
});
mongoose.model('Post', PostSchema);
Veuillez regarder, ici ref
n'a pas de valeur de type string
, maintenant il fait référence au schéma Comment
.
.\nodeapp\node_modules\mongoose\lib\index.js:452
throw new mongoose.Error.MissingSchemaError(name);
^
MissingSchemaError: Schema hasn't been registered for model "users".
Use mongoose.model(name, schema)
at new MissingSchemaError
J'ai eu cette erreur résolue lorsque j'utilise setTimeout sur server.js
mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
.then(() => logger.info("MongoDB successfully connected"))
.catch(err => logger.error(err));
app.use(passport.initialize());
setTimeout(function() {
require("./src/utils/passport")(passport);
}, 3000);
Cette erreur apparaît également lorsque nous créons de mauvaises références (ref) entre les modèles mangouste.
Dans mon cas, je parlais du nom du fichier au lieu du nom du modèle.
par exemple:
const userModel = mongoose.model ("user", userSchema);
Nous devrions faire référence à "utilisateur" (nom du modèle) au lieu de "utilisateur" (nom de fichier);
Vous devez également vérifier que votre base de données ne contient pas de données altérées. Je me suis retrouvé avec un document contenant la version minuscule du modèle référencé (user
au lieu de User
). Cela provoque l'erreur et est incroyablement difficile à détecter.
Facile à résoudre avec une requête rapide mongo:
db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })
Référez-vous au même nom que celui que vous utilisez dans le nom du modèle lors de la création d'un nouveau modèle.
Par exemple: si j'ai un modèle de mangouste comme:
var Post = mongoose.model("post",postSchema);
Ensuite, je dois faire référence à la collection d'articles en écrivant ref:"post"
.
Dans mon cas, ce problème, car je n’ai pas inclus le modèle ou le modèle de référence dans l’application . Vous devez donc obligatoirement utiliser Post model
et Comment model
dans votre application de noeud.
Expliquant la réponse de Rafael Grilli ci-dessus,
Correct:
var HouseSchema = new mongoose.Schema({
date: {type: Date, default:Date.now},
floorplan: String,
name:String,
house_id:String,
addressLine1:String,
addressLine2:String,
city:String,
postCode:String,
_locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
});
var House = mongoose.model('xxx', HouseSchema, 'houseschemas');